公众号:uncle39py

V1

2022/01/13阅读:60主题:默认主题

爬取cnbolgs文章

scrapy小案例:爬取cnblogs所有文章

阅读本章节前需先搞懂scrapy框架的使用

步骤:

1、新建一个scrapy项目和一个爬虫

scrapy startproject cnblogs

scrapy genspider cnblogs www.cnblogs.com

2、items,只爬取标题,链接,内容

import scrapy
class CnblogsItem(scrapy.Item):
    title = scrapy.Field()
    url = scrapy.Field()
    content = scrapy.Field()

3、爬虫cnbolgs.py

import scrapy
from scrapy import Request
from ..items import CnblogsItem
class CnblogsSpider(scrapy.Spider):
    name = 'cnblogs'
    allowed_domains = ['www.cnblogs.com']
    start_urls = ['https://www.cnblogs.com/']

    def parse(self, response):
        article_list = response.css('article.post-item')

        for article in article_list:
            item = CnblogsItem()
            # .代表当前目录,//代表所有的
            title = article.xpath('.//div[1]/a/text()').extract()[0]
            url = article.xpath('.//div[1]/a/@href').extract()[0]
            item['title'] = title
            item['url'] = url
            # yield一个请求给ENGINE,参数callback的值表示此请求回来的响应数据的解析函数是哪个。
            yield Request(url,callback=self.parser_detail,meta={'item':item})

        # 解析出下一页的地址
        next='https://www.cnblogs.com'+response.css('#paging_block>div a:last-child::attr(href)').extract_first()
        yield Request(next)
        
    #解析详情页的函数
    def parser_detail(self,response):
        content = response.css('#cnblogs_post_body').extract_first()
        item = response.meta.get('item')
        item['content']=content
        yield item

4、pipelines,数据库中的表要注意的是存储内容的字段content的字段类型要设置成text(mysql),否则内容太大写不到数据库中就会报错

import pymysql
class CnblogsPipeline:
    def open_spider(self,spider):
        #spider是爬虫对象,可以根据不同的爬虫做不同的持久化方案
        print(spider.name)
        self.conn=pymysql.connect( host='127.0.0.1', user='root', password="root",database='cnblogs', port=3306)

    def process_item(self,item, spider):
        cursor=self.conn.cursor()
        sql='insert into article (title,url,content) values (%s,%s,%s)'
        cursor.execute(sql,[item['title'],item['url'],item['content']])
        self.conn.commit()
        return item

    def close_spider(self,spider):
        self.conn.close()

settings介绍

1 增加并发:

默认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

分类:

后端

标签:

后端

作者介绍

公众号:uncle39py
V1