scrapy爬取完整网页完整数据,简书为例

如何使用scrapy框架爬取网页完整数据

项目准备

开启一个有模板的scrapy项目,在这里有scrapy经验的朋友应该都比较熟练了。进入到创建好的虚拟环境当中运行以下shell代码。

scrapy startproject [projectname]
cd projectname
scrapy genspider -t crawl spidername ["spiderdomain"]

完成之后就可以打开开发工具(pycharm),运行项目

分析简书页面

项目的目的是爬取简书的所有文章,所以从简书首页url着手。然后通过f12抓包查看文章url的基本格式可以观察到,打开一篇文章的url为https://www.jianshu.com/p/d97946dfdcef,而在首页显示的url为简书首页下方文章url项目url模板格式可以用正则匹配全站文章的url,匹配站内url将follow设为true。
rules = ( Rule(LinkExtractor(allow=r'.*/p/[0-9a-z]{12}.*'), callback='parse_detail', follow=True), )

获取所需数据

定义你的callback函数,以本人项目提取数据为例。

    def parse_detail(self, response):
        title=response.xpath('//h1[@class="title"]/text()').get()
        content=response.xpath('//div[@class="show-content-free"]').get()
        author=response.xpath('//span[@class="name"]/text()').get()
        #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        #item['name'] = response.xpath('//div[@id="name"]').get()
        #item['description'] = response.xpath('//div[@id="description"]').get()
        item=JianshuItem(content=content,title=title,author=author)
        yield item

更改item文件的数据域

class JianshuItem(scrapy.Item):
   
    author=scrapy.Field()
    title=scrapy.Field()
    content=scrapy.Field()

更改pipelines,根据个人实际需求,在此提供一种用twisted异步写入mysql数据库的方式

import pymysql
from twisted.enterprise import adbapi
from pymysql import cursors

class TwistedCrawlPipeline(object):
    def __init__(self):
        params = {
            'host': '127.0.0.1',
            'user': 'root',
            'password': 'welcome',
            'port': 3306,
            'database': 'jianshu',
            'cursorclass': cursors.DictCursor
        }
        self.dbpool = adbapi.ConnectionPool('pymysql', **params)
        self._sql = None

    @property
    def sql(self):
        if self._sql is None:
            self._sql = 'insert into jian1(id,content,title,author) values (null,%s,%s,%s)'
            return self._sql
        return self._sql

    def process_item(self, item, spider):
        defer = self.dbpool.runInteraction(self.insert_item)
        defer.addErrback(self.handle_error,item,spider)

    def insert_item(self, item, cursor):
        cursor.execute(self.sql, (str(item['content']), str(item['title']), str(item['author'])))

    def handle_error(self,error,item,spider):
        print('*'*20)
        print(error)

进入settings文件更改自定义的pipelines

创建cmdline运行爬虫

运行scrapy可以通过直接在命令行输入*scrapy crawl [爬虫名]*运行
也可以通过创建新的py文件运行

from scrapy import cmdline
cmdline.execute('scrapy crawl jiancrawl'.split())

不足与展望

简书有不少链接是通过ajax方式加载到网页上的,用这种方法爬取可能不能完成真正的完整爬取,后期我会出关于用selenium+scrapy爬取的方式。感谢关注。

你可能感兴趣的:(爬虫)