佛山建网站哪里好泰安seo推广
一、scrapy
scrapy:为爬取网站数据是,提取结构性数据而编写的应用框架
1. 安装
pip install scrapy
或者,国内源安装
pip install scrapy -i https://pypi.douban.com/simple
2. 报错
报错1)building ‘twisted.test.raiser’ extension
原因:缺少twisted库
解决:下载twisted库:
a)cp是python版本
b)amd是操作系统版本
安装twisted库:
使用:pip install 拖入twisted路径
twisted库安装完成后,再安装scrapy库
报错2)提示python -m pip install --upgrade pid
解决:运行python -m pip install --upgrade pid
报错3)win32错误
解决:pip install pypiwin32
仍然报错)
解决:安装Aanacoda工具
二、创建scrapy项目
1)创建scrapy项目
在终端中创建项目:
scrapy startproject 项目名
2)创建爬虫文件
在spiders文件夹中创建爬虫文件
a)切入spiders目录下:
cd 项目名\项目名\spiders
b) 在spiders文件夹中创建爬虫文件
scrapy genspider 文件名 要爬取的网页
一般情况下,要爬取的网页之前:不需要添加http协议
否则start-urls中的路径不成立
原因:start_urls的值是根据allowed_domains进行修改的,如果添加了http协议,allowed_domains的值需要用户手动修改
import scrapyclass Demo001Spider(scrapy.Spider):# 爬虫的名字:用于运行爬虫时,使用的值name = "demo001"# 允许访问的域名allowed_domains = ["www.baidu.com"]# 起始url地址:指的是第一次要访问的域名# start_urls是在allowed_domains之前添加1个http:// 在allowed_domains之后添加1个/start_urls = ["http://www.baidu.com"]
#执行了 start_urls之后执行的方法 方法中的response就是返回的对象 相当于1)response = urllib.requests.urlopen() 2)response = requests.get()def parse(self, response):pass
3)运行爬虫文件
scrapy crawl 爬虫的名字
做了反扒————
解决:注释掉君子协议:项目下的setting.py文件中的robots.txt协议
注释掉:ROBOTSTXT_OBEY = True
三、scrapy项目结构
项目名
项目名
spider文件夹 (存储爬虫文件)
init
自定义的爬虫文件 (核心功能文件)
init
items (定义数据结构的地方)(爬取的数据包含哪些)
middleware (中间件)(代理)
pipelines (管道)(处理下载的数据)
settings (配置文件)
四、response的属性和方法
3)4)5)常用
1)response.text
获取响应的字符串
2)response.body
获取响应的二进制数据
3)response.xpath
直接使用xpath方法解析response中的内容
4)response.extract()
提取selector对象中的data属性值
5)response.extract_first()
提取selector对象的第一个数据
五、scrapy工作原理
1). 引擎向spiders要url
2). 引擎将要爬取的url给调度器
3). 调度器将url生成请求对象,放入指定的队列
4). 从队列中出队一个请求
5). 引擎将请求交给下载器进行处理
6).下载器发送请求,向互联网请求数据
7). 下载器将数据返回给引擎
8). 引擎将数据再次给到spiders
9).spiders通过xpath解析数据
10). spiders将数据,或者url,给到引擎
11). 引擎判断该数据,是数据,还是url
a)是数据,交给管道处理
b)还是url,交给调度器处理
六、scrapy shell
scrapy终端
测试xpath和css表达式
免去了每次修改后,运行spiders的麻烦
使用:
终端中直接执行:
scrapy shell 域名
安装ipython(高亮,补全)
pip install ipython
七、懒加载中的src
有data-original,src用data-original替代
替换前:src = // ul[ @ id = "component_59"] / li // img / @ src
替换后:src = // ul[ @ id = "component_59"] / li // img / @ data-original
当当网练习中的第一张图片是none
原因:没有data-original
#有data-original,src用data-original替代src = li.xpath('.//img/@data-original').extract_first()# 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的 其他图片的地址是data-originalif src:src = srcelse:#用srcsrc = li.xpath('.//img/@src').extract_first()
当当网:
items.py:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
from urllib import responseimport scrapyclass DemoDdwItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# pass#图片# src = // ul[ @ id = "component_59"] / li // img / @ srcsrc = scrapy.Field()#名字# alt = // ul[ @ id = "component_59"] / li // img / @ altname = scrapy.Field()#价格# price = //ul[@id = "component_59"]/li//p[@class = "price"]/span[1]/text()price = scrapy.Field()# src、name、price都有共同的li标签# 所有的selector对象,都可以再次调用xpath方法li_list = response.xpath('//ul[@id = "component_59"]/li')for li in li_list:#.extract()提取数据#有data-original,src用data-original替代src = li.xpath('.//img/@data-original').extract_first()# 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的 其他图片的地址是data-originalif src:src = srcelse:#用srcsrc = li.xpath('.//img/@src').extract_first()alt = li.xpath('.//img/@alt').extract_first()price = li1.xpath('.//p[@class = "price"]/span[1]/text()').extract_first()print(src,name,price)