开启一个有模板的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将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
运行scrapy可以通过直接在命令行输入*scrapy crawl [爬虫名]*运行
也可以通过创建新的py文件运行
from scrapy import cmdline
cmdline.execute('scrapy crawl jiancrawl'.split())
简书有不少链接是通过ajax方式加载到网页上的,用这种方法爬取可能不能完成真正的完整爬取,后期我会出关于用selenium+scrapy爬取的方式。感谢关注。