一、安装步骤
1 在所需要的路径中安装
第一步安装lxml 利用pip install lxml
lxml是个非常有用的python库,它可以灵活高效地解析xml,与BeautifulSoup、requests结合,是编写爬虫的标准姿势。
2第二步安装zope.interface
pip install zope.interface
Python支持多继承,但是不支持接口,zope.inteface是其三方的接口实现库,在twisted中有大量使用
3 twisted
pip install twisted
Twisted是用Python实现的基于事件驱动的网络引擎框架。Twisted诞生于2000年初他支持很多种协议,包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。 非常好的一点是twisted实现和很多应用层的协议,开发人员可以直接只用这些协议的实现。其实要修改Twisted的SSH服务器端实现非常简单。很多时候,开发人员需要实现protocol类。
一个Twisted程序由reactor发起的主循环和一些回调函数组成。当事件发生了,比如一个client连接到了server,这时候服务器端的事件会被触发执行。再次之前,需要安装
Twisted-18.4.0-cp36-cp36m-win_amd64.whl和vc_redist15.x86.exe
,我的网盘有
4 第四步安装pyOpenSSL
pip install pyOpenSSL
5第五步安装pywin32
pip install pywin32
出错
pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等
下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/
下载后双击安装
若之后仍显示cannot import name ‘_win32stdio‘
则cmd中运行pip install pypiwin32
6 第六步安装Scrapy
pip install scrapy
scrapy 不同于简单的单线程爬虫,采用scrapy框架写python爬虫需要生成许多个文件,这一件类似于java里面的web框架,许多工作都可以通过一些配置文件来完成。
二、爬取流程
●新建项目 (Project):新建一个新的爬虫项目
●明确目标(Items):明确你想要抓取的目标
●制作爬虫(Spider):制作爬虫开始爬取网页
●存储内容(Pipeline):设计管道存储爬取内容
三、爬虫编写常用知识点
具体见http://www.w3school.com.cn/xpath/index.asp
3.1常用语法
●xpath():返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点
●css():返回一系列的selectors,每一个select表示一个css参数表达式选择的节点
●extract():返回一个unicode字符串,为选中的数据
●re():返回一串一个unicode字符串,为使用正则表达式抓取出来的内容
all_a=selector.xpath("//a[@download]").re(reg)
●在xpath方法中,获取文中的文字就要../text()
加在最后
3.2setting.py中存储的格式
Scrapy 自带了 Feed 输出,并且支持多种序列化格式(serialization format)及存储方式(storage backends)。
其自带支持的类型有:
JSON
FEED_FORMAT: json 大数据量情况下使用 JSON
JSON lines
FEED_FORMAT: jsonlines
CSV
FEED_FORMAT: csv
XML
FEED_FORMAT: xml
3.3css用法
选择器 | 示例 | 示例说明 | CSS |
---|---|---|---|
.class | .intro | 选择所有class=”intro”的元素 | 1 |
#id | firstname | 选择所有id=”firstname”的元素 | 1 |
* | * | 选择所有元素 | 2 |
element | p | 选择所有元素 | 1 |
element,element | div,p | 选择所有元素和元素 | 1 |
element element | div p | 选择元素内的所有元素 | 1 |
element>element | div>p | 选择所有父级是 元素的 元素 | 2 |
element+element | div+p | 选择所有紧接着元素之后的元素 | 2 |
[attribute] | [target] | 选择所有带有target属性元素 | 2 |
[attribute=value] | [target=-blank] | 选择所有使用target=”-blank”的元素 | 2 |
[attribute~=value] | [title~=flower] | 选择标题属性包含单词”flower”的所有元素 | 2 |
[attribute|=language] | [lang|=en] | 选择一个lang属性的起始值=”EN”的所有元素 | 2 |
:link | a:link | 选择所有未访问链接 | 1 |
:visited | a:visited | 选择所有访问过的链接 | 1 |
:active | a:active | 选择活动链接 | 1 |
:hover | a:hover | 选择鼠标在链接上面时 | 1 |
:focus | input:focus | 选择具有焦点的输入元素 | 2 |
:first-letter | p:first-letter | 选择每一个元素的第一个字母 | 1 |
:first-line | p:first-line | 选择每一个元素的第一行 | 1 |
:first-child | p:first-child | 指定只有当元素是其父级的第一个子级的样式。 | 2 |
:before | p:before | 在每个元素之前插入内容 | 2 |
:after | p:after | 在每个元素之后插入内容 | 2 |
:lang(language) | p:lang(it) | 选择一个lang属性的起始值=”it”的所有元素 | 2 |
element1~element2 | p~ul | 选择p元素之后的每一个ul元素 | 3 |
[attribute^=value] | a[src^=”https”] | 选择每一个src属性的值以”https”开头的元素 | 3 |
[[attribute =value\]](http://www.runoob.com/cssref/sel−attr−end.html)|a[src = v a l u e \] ] ( h t t p : / / w w w . r u n o o b . c o m / c s s r e f / s e l − a t t r − e n d . h t m l ) | a [ s r c =”.pdf”] | 选择每一个src属性的值以”.pdf”结尾的元素 | 3 | |
[attribute*=value] | a[src*=”runoob”] | 选择每一个src属性的值包含子字符串”runoob”的元素 | 3 |
:first-of-type | p:first-of-type | 选择每个p元素是其父级的第一个p元素 | 3 |
:last-of-type | p:last-of-type | 选择每个p元素是其父级的最后一个p元素 | 3 |
:only-of-type | p:only-of-type | 选择每个p元素是其父级的唯一p元素 | 3 |
:only-child | p:only-child | 选择每个p元素是其父级的唯一子元素 | 3 |
:nth-child(n) | p:nth-child(2) | 选择每个p元素是其父级的第二个子元素 | 3 |
:nth-last-child(n) | p:nth-last-child(2) | 选择每个p元素的是其父级的第二个子元素,从最后一个子项计数 | 3 |
:nth-of-type(n) | p:nth-of-type(2) | 选择每个p元素是其父级的第二个p元素 | 3 |
:nth-last-of-type(n) | p:nth-last-of-type(2) | 选择每个p元素的是其父级的第二个p元素,从最后一个子项计数 | 3 |
:last-child | p:last-child | 选择每个p元素是其父级的最后一个子级。 | 3 |
:root | :root | 选择文档的根元素 | 3 |
:empty | p:empty | 选择每个没有任何子级的p元素(包括文本节点) | 3 |
:target | news:target | 选择当前活动的#news元素(包含该锚名称的点击的URL) | 3 |
:enabled | input:enabled | 选择每一个已启用的输入元素 | 3 |
:disabled | input:disabled | 选择每一个禁用的输入元素 | 3 |
:checked | input:checked | 选择每个选中的输入元素 | 3 |
:not(selector) | :not(p) | 选择每个并非p元素的元素 | 3 |
::selection | ::selection | 匹配元素中被用户选中或处于高亮状态的部分 | 3 |
:out-of-range | :out-of-range | 匹配值在指定区间之外的input元素 | 3 |
:in-range | :in-range | 匹配值在指定区间之内的input元素 | 3 |
:read-write | :read-write | 用于匹配可读及可写的元素 | 3 |
:read-only | :read-only | 用于匹配设置 “readonly”(只读) 属性的元素 | 3 |
:optional | :optional | 用于匹配可选的输入元素 | 3 |
:required | :required | 用于匹配设置了 “required” 属性的元素 | 3 |
:valid | :valid | 用于匹配输入值为合法的元素 | 3 |
:invalid | :invalid | 用于匹配输入值为非法的元素 | |
[空格]::text | ::text | 文本 |
3.4xpath用法
3.4.1xpath选取节点
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
3.4.2xpath路径及表达式-1
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点。 |
/bookstore | 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
3.4.3xpath路径及表达式-2
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang=’eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
3.4.4xpath路径及表达式-3
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
3.4.5选取若干路径
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
3.4.6选取未知节点
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
#
四、爬取梦幻西游中连接的信息
(1)命令:
scrapy startproject menghuan
(2)打开新窗口,
在items文件中写入类,用来处理爬虫的数据,用来存放数据
import scrapy
from scrapy import Field,Item
class MenghuanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = Field()
src = Field()
spe=Field()
pass
(3)在Spiders文件中写入爬虫的类(css方法)
import scrapy
from scrapy.selector import Selector
from scrapy.spiders import CrawlSpider
from menghuan.items import MenghuanItem
class Menghuan(CrawlSpider):
name = "menghuange"
start_urls = ["http://xyq.163.com/download/down_music.html"]
def parse(self, response):
item = MenghuanItem()
selector = Selector(response)
parent = selector.css('#dLeft .g-clr section')[0].css('tbody tr')
for i in parent:
td=i.xpath("td/text()").extract()
print(td)
href=i.xpath("td/a/@href").extract()
print(href)
item['name'] = td[0]
item['src'] = href
item['spe'] = td[1]
yield item
(4)在setting文件中写代理或者ip
USER_AGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) '
'Chrome/19.0.1084.54 Safari/536.5'
FEED_URI=u'file:///D:/pycharm2017.3.2/work/scrapy 0608/megnhuan/menghuan.csv'
FEED_FORMAT = 'CSV'
(5)新建一个主要运行的文件
from scrapy import cmdline
cmdline.execute("scrapy crawl menghuange".split()) #在此运行文件是爬虫的文件
五、爬取豆瓣的网页的电影信息
(1)命令:
scrapy startproject doubanTest
(2)打开新窗口,
在items文件中写入类,用来处理爬虫的数据,用来存放数据
import scrapy
from scrapy import Item, Field
class DoubantuItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title=Field() #电影名称
movieInfo = Field() # 电影介绍
star = Field()#评分
critical = Field()#评分人数
quote = Field()#经典的话
pass
(3)在Spiders文件中写入爬虫的类(xpath方法)
import scrapy
from scrapy.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from doubanTU.items import DoubantuItem #导入类
import re
class douban(CrawlSpider):
name="doubantext" #文件名与name一致
start_urls=["https://movie.douban.com/top250"]
def parse(self,respone):
item=DoubantuItem() #items中的类
seletor=Selector(respone) #处理返回结果
Movies=seletor.xpath('//div[@class="info"]') #选取所有class="info"的内容
#提取所有的信息
#####################在读取网页内容的时候与编程方式不一样,在这里,1 就是第一个,4就是第四个
for eachMovie in Movies:
fullTitle=eachMovie.xpath("div[@class='hd']/a/span[@class='title'][1]/text()").extract()
star=eachMovie.xpath("div[@class='bd']/div[@class='star']/span[2]/text()").extract()
movieInfo = eachMovie.xpath("div[@class='bd']/p[1]/text()").extract()
craticalStr=eachMovie.xpath("div[@class='bd']/div[@class='star']/span[4]/text()").extract()[0]
critical=re.sub("\D","",craticalStr) # 使用空字符串代替"\D"
quote=eachMovie.xpath("p[@class='quote']/span[@class='inq']/text()")
if quote:
print("+++++++++++++quote++++++++++++++++",quote)
quote=quote[0]
else:
quote="无评论"
item["title"]=fullTitle
item["movieInfo"]=movieInfo[0].strip()
item["star"]=star
item["critical"]=critical
item["quote"]=quote
yield item # 提交给item pipeline
(4)在setting文件中写代理或者ip
USER_AGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) '
'Chrome/19.0.1084.54 Safari/536.5'
FEED_URI=u'file:///D:/pycharm2017.3.2/work/scrapy 0608/doubanTU/douban.csv'
FEED_FORMAT = 'CSV'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'doubanTU (+http://www.yourdomain.com)'
(5)新建一个主要运行的文件
from scrapy import cmdline
cmdline.execute("scrapy crawl doubantext".split())