老早之前就听说过python的scrapy。这是一个分布式爬虫的框架,可以让你轻松写出高性能的分布式异步爬虫。使用框架的最大好处当然就是不同重复造轮子了,因为有很多东西框架当中都有了,直接拿过来使用就可以了。scrapy 就是一个很棒的框架。最近在看崔庆才老师的博客http://cuiqingcai.com/ 的时候,发现了几个写的非常好的scrapy教程(http://cuiqingcai.com/4380.html,http://cuiqingcai.com/3952.html等,还有很多,大家可以自己去看),我看了半个小时就把以前看的scrapy基础回忆起来了,而且又学到了很多新的东西,所以就手痒痒用scrapy写了一个自己的爬虫,记录在这里。

  脚本之家(http://www.jb51.net/)是我写代码查某个函数怎么怎么用(有时候忘了)经常去的地方,虽然站点界面像shi一样,又有许多杂七杂八的广告,不过说句公道话,还有有不少干货的,大部分也都附有源代码。今天我要爬取的就是脚本之家的文章。

  在开始之前,先简单介绍一下scrapy的常用命令吧。我不打算讲的非常详细,要想详细了解,可以参考文档(http://wiki.jikexueyuan.com/project/scrapy/)或者上面我说的几篇博客。scrapy 创建一个 项目 使用的命令是: scrapy crawl project_name (project_name是你的项目名称) 这个命令需要在cmd(windows)或者shell(linux)下键入,这就会在当前目录下创建名称为 project_name 的项目。然后 cd 到这个项目,输入命令 genspider your_spider_name 来快速创建一个爬虫,your_spider_name 为你的爬虫的名字,注意这个名字必须是唯一的,这个命令在 project_name/project_name/spiders/目录下 生成了一个 your_spider_name.py 文件,你的爬虫就写到这里啦。

  常见的几个文件作用如下:

  spiders 文件夹用来存放你写的爬虫的脚本

  items.py 用来定义你想要抓取的数据字段

  middlewares.py 用来给scrapy增加一些额外的自定义的功能(比如后面要讲的设置代理等等)

  piplines.py 用来定义抓取数据的储存方式

  settings.py 是用来设置爬虫参数的文件

  打开 爬虫文件,一般是已经给你 写好了一个 类,类似这样:

class JbzjSpiderSpider(scrapy.Spider):name = "jbzj_spider"allowed_domains = ["www.jb51.net"]base_url = "http://www.jb51.net"start_urls = []def parse(self, response):pass

  其中 name 是爬虫的名字(唯一),allowed_domains 为允许抓取的域名,start_urls 为 起始抓取的列表,如果没有特别指定抓取的url,就从start_urls列表中的地址抓取,类必须继承自 scrapy.Spider,这是所有爬虫都必须继承的一个类,parse 是 scrapy.Spider 的一个方法,我们有的时候需要将他覆写(override),这个方法是默认的回调函数(callback),如果没有指定函数的回调函数的话,就会默认调用 parse函数。response 是解析 url 得到的相应,里面包含响应头,响应网页源码,url等等,比如 response.body 得到 网页源码,response.url 得到响应的url。对于解析网页,scrapy默认使用的方法是xpath 解析。比如可以直接使用 response.xpath("//a[@id="id1"]/@href").extract()得到id = id1的a标签的href属性(xpath的用法大家自行搜索,入门很快),使用 extract 方法返回的是一个列表。当然,除了使用xpath,你可以得到 response.body 之后,再使用你习惯解析html的方法(正则,css,bs4等等)。最后,一般我们需要 yield 一个 scrapy.Request 即相当于返回一个请求,这个请求可以设置很多参数,比较重要的有 headers(头部信息),callback(回调函数),meta(传递额外信息,默认传递的只是response)。比如我们写 yield scrapy.Request(url,callback=self.parse_url),就是设定回调函数为 parse_url 函数,我们将 response 传递给parse_url 进行进一步解析。

  还有一点就是,在这里我们将爬取到的数据存入数据库,python 连接数据库一般有 MySQLdb 和 pymysql 两个驱动可以选择,我一般使用的是前者,但是比较坑爹的是

MySQLdb 好像只支持 32 位系统,反正我用64位的python 装了好多次都没成功。所以建议使用 pip install pymysql 来安装,pymysql 使用纯python写的驱动,用法和 mysqldb差不多。我们需要在piplines.py 中 写插入数据库的操作,代码大概像下面这样:

 1 import pymysql
 2
 3 class JbzjPipeline(object):
 4     def process_item(self, item, spider):
 5         url = item['article_url'] # 文章url
 6         title = item['article_title'] # 文章标题
 7         content = item['article_content'] # 内容
 8         # 建立数据库连接
 9         conn = pymysql.connect(host = 'localhost',user = 'root',passwd = 'passwd',db = 'your_db',charset = 'utf8')
10         cursor = conn.cursor()
11         sql = "insert into jbzj VALUES(NULL,%s,%s,%s)"
12         cursor.execute(sql,(url,title,content)) # 执行sql语句
13         cursor.close()
14         conn.commit() # 提交数据库
15         print(u"成功插入一条数据!")
16         conn.close() # 关闭连接

我们需要覆写 JbzjPipeline 类的 process_item 方法,这个方法在 yield item 之后会自动调用,需要传入两个参数,一个是item(数据字段),一个是spider(哪个爬虫),我们在这个函数下写插入数据进入数据库的操作就可以了。

对了还有 items.py 文件,大概长下面这样:

class JbzjItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()article_url = scrapy.Field() # 文章链接article_title = scrapy.Field() # 文章标题article_content = scrapy.Field() # 文章内容

我们采用 name = scrapy.Field()这样的形式来定义我们需要的字段,类需要继承自 scrapy.Item,在这里我就简单定义了文章链接、内容和标题三个字段。

总结一下:scrapy 抓取的基本步骤大概就是:从start_urls 中的url开始抓取,默认调用 start_requests ,然后将响应的请求传给 parse方法,parse方法再传递给它的回调函数,以此类推,直到最后一层 yield item,然后 piplines.py 开始处理数据的储存,当然我说的很简单,实际处理的过程比这个还要复杂一点,scrapy默认就是开启多线程的,整个过程不是顺序执行,如果想要彻底弄明白scrapy运行的机制,可以去找官方文档。

    最后 给出实际的代码:

jbzj_spider.py

# -*- coding: utf-8 -*-
'''
scrapy 脚本之家爬虫实例:http://www.jb51.net/article/54323.htm
'''
import reimport scrapy
from ..items import JbzjItem
from scrapy.selector import Selectorclass JbzjSpiderSpider(scrapy.Spider):name = "jbzj_spider"allowed_domains = ["www.jb51.net"]base_url = "http://www.jb51.net"start_urls = ['http://www.jb51.net/article/109909.htm','http://www.jb51.net/article/110219.htm']# def start_requests(self):#     yield scrapy.Request(self.start_urls[0],callback=self.parse)def parse(self, response):html = response.body # 网页源码urls_list = re.findall(re.compile(r'<a href="(/article/\d+\.htm)".+?</a>'),html)full_urls_list = [self.base_url + url for url in urls_list] # 完整列表for url in full_urls_list:yield scrapy.Request(url,callback=self.parse_url)def parse_url(self,response):item = JbzjItem() # 实例化一个itemselector = Selector(response) # 构造一个选择器title = selector.xpath("//div[@class='title']/h1/text()").extract()[0] # 标题content = selector.xpath("//div[@id='content']//text()").extract() # 内容item['article_url'] = response.urlitem['article_title'] = titleitem['article_content'] = "".join(content)yield itemhtml = response.body # 网页源码urls_list = re.findall(re.compile(r'<a href="(/article/\d+\.htm)".+?</a>'),html)full_urls_list = [self.base_url + url for url in urls_list] # 完整列表for url in full_urls_list:yield scrapy.Request(url,callback=self.parse_url2)def parse_url2(self,response):item = JbzjItem() # 实例化一个itemselector = Selector(response) # 构造一个选择器title = selector.xpath("//div[@class='title']/h1/text()").extract()[0] # 标题content = selector.xpath("//div[@id='content']//text()").extract() # 内容item['article_url'] = response.urlitem['article_title'] = titleitem['article_content'] = "".join(content)yield item

对了,为了使用piplines.py,我们需要将 settings.py 中的 ITEM_PIPELINES 一项注释去掉,不然无法使用 piplines。

以上就是 本文的基本内容,后续有时间还会更新 scrapy的其他方面的内容。

热爱编程,热爱机器学习! github:http://www.github.com/Lyrichu github blog:http://Lyrichu.github.io 个人博客站点:http://www.movieb2b.com(不再维护)

python scrapy 抓取脚本之家文章(scrapy 入门使用简介)相关推荐

  1. Python实现抓取微信公众号文章

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 前言 对于抓取微信公众号文章主要通过代理ip抓包进行的操作,总会出现一些问题,以下问题导致无法抓包. ...

  2. Python轻松抓取微信公众号文章

    今天继续向 Python 头条添加数据信息,完成了微信公号的爬虫,接下来会继续通过搜狗的知乎搜索抓取知乎上与 Python 相关的文章.问答.微信公众号的文章链接有些是具有时效性的,过一段时间会变成参 ...

  3. 利用Python爬虫抓取小说网站全部文章

    我们先来选定爬取目标,我爬取的网站是https://www.17k.com/ ,一些大型的网站(如起点.豆瓣等)做了反爬虫的部署,这会大大增加我们抓取的难度,所以尽量还是选一些不那么热门的网站. 爬虫 ...

  4. python爬虫抓取微信公众号文章(含全文图以及点赞数、在看数、阅读数)

    因工作需要写了一个微信公众号文章的爬虫程序,贴一下分享给需要的朋友. 首先是抓取文章的url链接,在反复研究之后找到的一个最简单的方法,不需要抓包工具.首先需要自己注册一个微信公众号,有微信即可绑定注 ...

  5. 简单python日志抓取脚本

    #!/usr/bin/python#coding:utf-8import rex=open('access1.log')abc={}for i in x: m=re.search('firefox', ...

  6. Python中使用Scrapy爬虫抓取上海链家房价信息

    文章目录 前言 准备工作 创建一个新的Scrapy项目 定义一个爬虫Spider 导出抓取数据 保存数据到数据库(MongoDB) 前言 之前用python写了一个简单的爬虫项目用来抓取上海链家上的一 ...

  7. Python进阶之Scrapy利用ImagesPipeline抓取汽车之家宝马5系缩略图

    Python进阶之Scrapy利用ImagesPipeline抓取汽车之家宝马5系缩略图 1. 创建项目 2. 使用ImagesPipeline爬取数据 items.py setings.py aut ...

  8. python wechatsougou_python抓取搜狗微信公众号文章

    初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql # 创建连接 ...

  9. python公众号文章_Python 抓取微信公众号文章

    起因是刷微信的时候看到一篇文章,Python 抓取微信公众号文章保存成pdf,很容易搜到,就不贴出来了 先用chrome登陆微信公众号后台,先获取一下自己的cookie,复制下来就行,解析一下转换成 ...

最新文章

  1. ssh遇到port 22:No route to host问题的解决方法
  2. 明明白白学C#第0章准备工作
  3. XJOI 3585 The rescue plan 营救计划 题解
  4. 微软Office Online服务安装部署及wopi代码实现--------域控制服务器安装
  5. 学习视觉和语言的多粒度对齐?字节提出新多模态预训练方法 X-VLM:代码已开源!...
  6. 企业有了程序员为什么还要用 低代码/无代码
  7. Java 7功能概述
  8. js中什么是对象,对象的概念是什么?
  9. Python版双链表结构与有关操作
  10. windows 安装pip 和 pychar 安装pymysql
  11. Myeclipse8.6安装freemarker插件
  12. 解决springmvc加载JS,CSS等文件问题【转】
  13. python 并行读取文件_python对文件进行并行计算初探(二)
  14. 【莓闻】芮成钢专访黑莓CEO巴尔西利
  15. Eclipse2020+Tomcat9.0+Maven Web配置!
  16. qt中使用mysql模糊查询_mysql数据库模糊查询简介
  17. 为RemoteApp的登录用户(域用户)添加输入法的方法
  18. [机器学习]决策树选西瓜
  19. Android 软键盘功能键(EditText)
  20. 自学Python兼职赚钱靠谱吗?

热门文章

  1. 软件项目开发流程及配置人员
  2. mysql 查询重写_mysql 学习 - 查询重写规则
  3. 2018.4.13 用java配置/生成Xml文件 结合IO流知识点
  4. sklearn多分类问题
  5. CodeForces-734E Anton and Tree 树的直径
  6. python 错误--UnboundLocalError: local variable '**' referenced before assignment
  7. 浅述numpy中argsort()函数的用法
  8. 机器学习资料推荐 URL
  9. Linux组管理和权限管理
  10. 微信第三方扫描登录pc端接口提示redirect_uri 参数错误解决