scrapy startproject YourProjectName
建立scrapy项目
开始爬虫
scrapy crawl SpiderName
开始执行爬虫
以上仿麻烦
根目录新建执行文件from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'dingdian'])
顶点为spider的name
定义爬取的字段
就比如说爬小说
字段有 小说作者,小说内容等
Item文件下定义class DingdianItem(scrapy.Item): author = scrapy.Field() content = scrapy.Field()
如上,定义一定要继承Item
然后字段皆为Field(), 没有其他类型
比Django要方便的多开始写核心spider部分
spider以start_requests为初始函数,该函数必须yield一个可迭代对象
比如Request(url, call_back, meta)
参数说明url,即需要Request.get 的内容,call_back是一个parse函数,该函数可接受一个由刚才的get获取的response, meta是由上一个Request往这传的时候可以带上的参数parse 最终要yield 或 return 一个或多个 Item,来进行后续处理
这里有个巨大的
坑:
response尽量一次处理,不要在多个parse之间执行,因为所有的url,但凡被Request过,不会被二次请求,简单来说,url通常不能为response.url,如果你跟我一样踩到这个坑,注意这个解决方法
Scrapy的官方文档:
http://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request
Request函数在文档中的定义:
class scrapy.http.Request(url[, callback, method=’GET’, headers, body, cookies, meta, encoding=’utf-8’, priority=0, dont_filter=False, errback])
在这儿, request的 dont_filter 设置为True就可以了
- Item被收集完成后,进入pipeline,
这里就进行最后的处理了,可以将Item的内容提取出来,进行数据库等的存储
模板:
class DingdianPipeline(object):
def process_item(self, item, spider):
# deferToThread(self._process_item, item, spider
if isinstance(item, DcontentItem):
url = item['chapterurl']
name_id = item['id_name']
num_id = item['num']
xs_chaptername = item['chaptername']
xs_content = item['chaptercontent']
Sql.insert_novel(name, content, name_id, num_id, url)
print('小说存储完毕')
return item
def process_item(self, item, spider):该方法必须重写,且return item此外,此函数通常功能即为去重后存储
以上为此次学习内容,差点一下午完成,踩坑踩两天