首页 > 其他分享 >爬虫六

爬虫六

时间:2023-11-09 17:48:40浏览次数:27  
标签:xpath text 爬虫 item article extract desc

scrapy解析数据

运行爬虫

scrapy crawl cnblogs

可以项目目录下写个main.py

  from scrapy.cmdline import execute
  execute(['scrapy','crawl','cnblogs','--nolog'])

重点

1、response对象有css方法和xpath方法

  -css中写css选择器  response.css('')

  -xpath中写xpath选择  response.xpath('')

2、重点1

  xpath取文本内容

  './/a[contains(@class,"link-title")]/text()'

  xpath取属性

  './/a[contains(@class,"link-title")]/@href'

  css取文本

  'a.link-title::text'

  css取属性

  'img.image-scale::attr(src)'

3、重点2

  .extract_first()  取一个

.  extract()        取所有

使用css选择器解析数据

 def parse(self, response):
        article_list = response.css('article.post-item')
        for article in article_list:
            name = article.css('a.post-item-title::text').extract_first()    #属性是post-item-title的a标签
            author = article.css('a.post-item-author>span::text').extract_first()
            url = article.css('a.post-item-title::attr(href)').extract_first()
            img = article.css('img.avatar::attr(src)').extract_first()
            desc = article.css('p.post-item-summary::text').extract()  # 文本内容可能放在第二个位置
            desc_content=desc[0].replace('\n', '').replace(' ', '')
            if not desc_content:
                desc_content = desc[1].replace('\n', '').replace(' ', '')

            print('''
            文章标题:%s
            文章作者:%s
            文章地址:%s
            头像:%s
            摘要:%s
            ''' % (name, author, url, img, desc_content))

    #### xpath 解析数据
    def parse(self, response):
        article_list = response.xpath('//article[@class="post-item"]')
        for article in article_list:
            name = article.xpath('.//a[@class="post-item-title"]/text()').extract_first()
            # name = article.xpath('./section/div/a/text()').extract_first()
            author = article.xpath('.//a[@class="post-item-author"]/span/text()').extract_first()
            url = article.xpath('.//a[@class="post-item-title"]/@href').extract_first()
            img = article.xpath('./section/div/p/a/img/@src').extract_first()
            desc = article.xpath('./section/div/p/text()').extract()  # 文本内容可能放在第二个位置
            desc_content = desc[0].replace('\n', '').replace(' ', '')
            if not desc_content:
                desc_content = desc[1].replace('\n', '').replace(' ', '')

            print('''
            文章标题:%s
            文章作者:%s
            文章地址:%s
            头像:%s
            摘要:%s
            ''' % (name, author, url, img, desc_content))

配置文件

基础配置

项目名

  BOT_NAME = "scrapy_demo"

爬虫所在路径

  SPIDER_MODULES = ["scrapy_demo.spiders"]

  NEWSPIDER_MODULE = "scrapy_demo.spiders"

记住  日志级别 

LOG_LEVEL='ERROR'

 

请求头中的  USER_AGENT(找浏览器中的USER_AGENT)

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" 

 

是否遵循爬虫协议(一般不遵循,否则很多无法实现)

ROBOTSTXT_OBEY = False

 

默认请求头

#DEFAULT_REQUEST_HEADERS = {
# "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
# "Accept-Language": "en",
#}

 

#爬虫中间件
#SPIDER_MIDDLEWARES = {
# "scrapy_demo.middlewares.ScrapyDemoSpiderMiddleware": 543,
#}

 

# 下载中间件
#DOWNLOADER_MIDDLEWARES = {
# "scrapy_demo.middlewares.ScrapyDemoDownloaderMiddleware": 543,
#}

# 持久化相关
#ITEM_PIPELINES = {
# "scrapy_demo.pipelines.ScrapyDemoPipeline": 300,
#}

 

高级配置(提高爬取效率)

1 、增加并发:默认16

默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改
CONCURRENT_REQUESTS = 100
值为100,并发设置成了为100

2 、提高日志级别:

在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:
LOG_LEVEL = 'INFO'

3 、禁止cookie:

如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:
COOKIES_ENABLED = False

4 、禁止重试:

对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:
RETRY_ENABLED = False

5 、减少下载超时:

如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:
DOWNLOAD_TIMEOUT = 10 超时时间为10s

 

整站爬取cnblogs--》爬取详情--》数据传递

整站爬取:

  爬取所有页
  -解析出下一页 yield Request(url=next, callback=self.parse)

  爬取文章详情

  -解析出详情地址:yield Request(url=url, callback=self.detail_parser)

  多个Request之间数据传递

  yield Request(url=url,meta={'item':item})
在解析的 response中 response.meta.get('item')

 def parse(self, response):
        article_list = response.xpath('//article[@class="post-item"]')
        for article in article_list:
            name = article.xpath('.//a[@class="post-item-title"]/text()').extract_first()
            # name = article.xpath('./section/div/a/text()').extract_first()
            author = article.xpath('.//a[@class="post-item-author"]/span/text()').extract_first()
            url = article.xpath('.//a[@class="post-item-title"]/@href').extract_first()
            img = article.xpath('./section/div/p/a/img/@src').extract_first()
            desc = article.xpath('./section/div/p/text()').extract()  # 文本内容可能放在第二个位置
            desc_content = desc[0].replace('\n', '').replace(' ', '')
            if not desc_content:
                desc_content = desc[1].replace('\n', '').replace(' ', '')

            # print('''
            # 文章标题:%s
            # 文章作者:%s
            # 文章地址:%s
            # 头像:%s
            # 摘要:%s
            # ''' % (name, author, url, img, desc_content))
            # 详情地址:url ----》想继续爬取详情
            item={'name':name,'url':url,'img':img,'text':None}
            yield Request(url=url, callback=self.detail_parser,meta={'item':item})

        #### 继续爬取下一页
        # next='https://www.cnblogs.com'+response.css('div.pager>a:last-child::attr(href)').extract_first()
        next = 'https://www.cnblogs.com' + response.xpath('//div[@class="pager"]/a[last()]/@href').extract_first()
        print(next)
        yield Request(url=next, callback=self.parse)

        # 逻辑---》起始地址:https://www.cnblogs.com---》回到了parse---》自己解析了(打印数据,继续爬取的地址)---》yield Request对象---》第二页---》爬完后又回到parser解析

    def detail_parser(self, response):
        print(len(response.text))
        item=response.meta.get('item')
        text=response.css('#cnblogs_post_body').extract_first()
        item['text']=text
        # 我们想把:上一个请求解析出来的  标题,摘要,图片 和这个请求解析出来的 文本合并到一起
        # 这个text 无法和 上面 parse解析出的文章标题对应上
        print(item)

 

标签:xpath,text,爬虫,item,article,extract,desc
From: https://www.cnblogs.com/YeeQX/p/17822382.html

相关文章

  • Scala中编写多线程爬虫程序并做可视化处理
    在Scala中编写一个爬虫程序来爬取店铺商品并进行可视化处理,需要使用Selenium和Jsoup库来操作网页。在这个例子中,我们将使用多线程来提高爬取速度。1、首先,我们需要引入所需的库:importorg.openqa.selenium.Byimportorg.openqa.selenium.WebDriverimportorg.openqa.selenium.Web......
  • 爬虫-mysql-工具
    MySQL数据库一、MySQL数据库的介绍1、发展史1996年,MySQL1.02008年1月16号Sun公司收购MySQL。2009年4月20,Oracle收购Sun公司。MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任......
  • 爬虫五
    打码平台2、登录某些网站,会有验证码---》想自动破解数字字母:python模块:ddddocr计算题,成语题,滑块。。。:第三方打码平台,人工操作 2、打码平台云打码,超级鹰 3、咱们破解网站登录的思路使用selenium----》打开网站----》(不能解析出验证码地址)---》使用截图 案......
  • 爬虫常用写法和用法
    1、查找所有:结果=re.findall(正则,字符串)=>返回列表,用法:r""专业写正则的。没有转义的烦恼,result=re.findall(r"\d+","我有1000万,不给你花,我有1块我给你")2、结果=re.finditer(正则,字符串)=>返回迭代器(需要for循环),result=re.finditer(r"\d+","我有1000万,不......
  • python爬虫怎么翻页 ?
    首先,你需要安装相关的库。在你的命令行窗口中,输入以下命令来安装所需的库:pipinstallrequestsbeautifulsoup4然后,你可以使用以下代码来爬取网页内容并翻页:packagemainimport("fmt""net/http""io/ioutil""encoding/gob""log")funcmain(){......
  • 【python爬虫】80页md笔记0基础到scrapy项目高手,第(4)篇:requests和网络数据获取进阶
    本阶段主要学习requests这个http模块,该模块主要用于发送请求响应,该模块有很多的替代模块,比如说urllib模块,但是在工作中用的最多的还是requests模块,requests的代码简洁易懂,相对于臃肿的urllib模块,使用requests编写的爬虫代码将会更少,而且实现某一功能将会简单。因此建议大家掌握该......
  • 爬虫三
    搜索文档树1、find_all:找所有 列表2、find 找一个Tag类的对象find和find_all五种过滤器(字符串、正则表达式、列表、True、方法):字符串可以按标签名,可以按属性,可以按文本内容无论按标签名,按属性,按文本内容都是按字符串形式查找: p=soup.find('p')找到类名叫story......
  • django+爬虫+钉钉机器人
    Views类urls类Html结果......
  • 利用Ruby网络爬虫库采集文库
    今天我们安装一个Ruby的网络爬虫库叫做Nokogiri,它可以帮助我们解析网页的HTML代码,提取出我们需要的信息。我们可以在终端中使用geminstallnokogiri来进行安装。其次,我们需要使用open-uri库来打开网页,然后使用Nokogiri库来解析HTML代码。以下是具体的代码:```rubyrequ......
  • 爬虫之抓取js生成的数据
    有很多页面,当我们用request发送请求,返回的内容里面并没有页面上显示的数据,主要有两种情况,一是通过ajax异步发送请求,得到响应把数据放入页面中,对于这种情况,我们可以查看关于ajax的请求,然后分析ajax请求路径和响应,拿到想要的数据;另外一种就是js动态加载得到的数据,然后放入页面中。这......