• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Scrapy框架-阳光政务平台爬虫二

武飞扬头像
Goker123
帮助1

Scrapy框架-阳光政务平台爬虫(二)

想要爬取的网站:微信读书
爬取内容:各个排行榜中的 书名 作者名 详情页网站 评分 出版社 出版日期
文末有工程文件

items.py设置

  • 配置items.py文件

    • items.py文件中NameItem(scrapy.Item)类中写入
    name = scrapy.Field()
    author = scrapy.Field()
    grade = scrapy.Field()
    press = scrapy.Field()
    publish_date = scrapy.Field()
    detail_url = scrapy.Field()
    
    • 这一部分相当于整合信息条目,而且方便检查在写爬虫文件时的拼写错误

setting.py设置

  • 开启并修改网络代理
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36 Edg/96.0.1054.29'  
    # agent可以在浏览器中任意页面的检查中找一个
    
    
  • 添加日志打印等级
    LOG_LEVEL = "WARNING"
    
  • 开启pipeline交互,若不开启,爬虫文件的数据就无法传递给pipeline.py文件
    ITEM_PIPELINES = {
    'yangguang.pipelines.YangguangPipeline': 300,
    }
    

爬虫内容

  • 代码
    	import scrapy
    import re
    from ..items import WxbookItem
    
    class WxSpider(scrapy.Spider):
        name = 'wx'
        allowed_domains = ['weread.qq.com']
        start_urls = ['https://weread.qq.com/web/category/']  # 爬取的榜单页面
    
        def parse(self, response):
            # 1.大分类分组
            li_list = response.xpath('//ul[@class="ranking_list"]/li')
            for li in li_list:
                item = WxbookItem()
                rank_url = 'https://weread.qq.com'   li.xpath('./a/@href').extract_first()  # 各榜单url
                # print(rank_name_1, rank_href_1)
                yield scrapy.Request(
                    rank_url,
                    callback=self.parse_rank_0,  # 回调详情页爬虫程序
                    meta={"item": item}  # 传递item数据
                )
    
        def parse_rank_0(self, response):
            item = response.meta["item"]
            # 2.小分类分组
            div_list = response.xpath('//div[@class="ranking_page_header"]/div/div')
            num_0 = re.sub("\D", "", response.url)
            rank_num = 0
            rank_url_2 = []
            try:
                for div in div_list:     # 根据页面url构造分榜单url
                    rank_num  = 1
                for num in range(rank_num):
                    rank_url_2.append('https://weread.qq.com/web/category/'   str(int(num_0) num))
                for url in rank_url_2:
                    yield scrapy.Request(
                        url,
                        callback=self.parse_rank_1,  # 回调详情页爬虫程序
                        meta={"item": item}  # 传递item数据
                        )
            except:
                pass
    
        def parse_rank_1(self, response):
            item = response.meta["item"]
            li_list = response.xpath('//ul[@class="ranking_content_bookList"]/li')
            for li in li_list:  # 分榜单页提取部分信息和详情页url
                item["author"] = li.xpath('./div[1]/div[2]/p[2]/a/text()').extract_first()
                item["grade"] = li.xpath('./div[1]/div[2]/p[3]/span[3]/span/text()').extract_first()
                item["detail_url"] = 'https://weread.qq.com'   li.xpath('./a/@href').extract_first()
                # print(item)
                yield scrapy.Request(
                    item["detail_url"],
                    callback=self.parse_detail,  # 回调详情页爬虫程序
                    meta={"item": item}  # 传递item数据
                    )
    
        def parse_detail(self, response):
            item = response.meta["item"]
            item["detail_url"] = response.url  # 提取剩余信息
            item["name"] = response.xpath('//div[@class="bookInfo_right"]/h2/div/text()').extract_first()
            item["author"] = response.xpath('//div[@class="bookInfo_right"]/div/a/text()').extract_first()
            item["press"] = response.xpath('//div[@class="wr_dialog"]/div/div/div[2]/span[2]/text()').extract_first()
            item["grade"] = response.xpath('//div[@class="book_ratings_container"]/div[2]/div[1]/span[1]/text()').extract_first()
            item["publish_date"] = response.xpath('//div[@class="wr_dialog"]/div/div/div[3]/span[2]/text()').extract_first()
            print(item)
    
    
    学新通
  • 几点注意事项
    • 一定要导入item类,否则无法保存信息
    • allowed_domains一定要写对,特别是自己定义的函数(parse_detail)所用的url一定要在allowed_domains的范围内,否则会不执行回调函数。
      比如回调函数请求网站:[https://book.douban.com/top250?start=1]
      而allowed_domains = [“douban.com”] 就无法正常回调

pipeline.py设置

  • 代码
    class WxbookPipeline:
    def process_item(self, item, spider):
        print(item["name"])
        return item
    

自定义run.py

  • 之前的文章说过,跑scrapy程序需要在命令行中输入scrapy crawl xxx
    这种在命令行中的交互方式实在不方便,那我们在工程目录下定义一个run.py文件就可以直接在pycharm里运行这个run.py文件就能实现在pycharm里进行交互了。
  • 代码
    from scrapy import cmdline
    
    cmdline.execute('scrapy crawl wx'.split()) 
    
    

结果

{'author': '黑格尔',
 'detail_url': 'https://weread.qq.com/web/reader/bbe32a1072051bbdbbed499',
 'grade': ' 90.0',
 'name': '精神现象学·上卷(汉译世界学术名著丛书)',
 'press': '商务印书馆',
 'publish_date': '1979年6月'}

链接: 工程文件

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfifbe
系列文章
更多 icon
同类精品
更多 icon
继续加载