import scrapy # 导入scrapy
# 创建爬虫类 并且继承自scrapy.Spider --> 最基础的类 另外几个各类都是继承自这个类
class ProxySpider(scrapy.Spider):
name = 'proxy' # 爬虫名字--> 必须唯一
allowed_domains = ['cn-proxy.com'] # 允许采集的域名
start_urls = [f'http://cn-proxy.com/{page}' for page in range(1,3685)] # 开始采集的网站
# start_urls = ['http://cn-proxy.com/' for page in range(1, 3685)] # 开始采集的网站
# 解析响应数据 提取数据 或者网址等 response 就是网页源码
def parse(self, response):
#提取数据
#提取ip 和 port
selectors = response.xpath('//tr') #选择所有的tr标签
#循环遍历tr标签下的td标签
for selector in selectors:
ip = selector.xpath('./td[1]/text()').get() #(单个) .表示在当前节点下继续选择 和 selectors
port = selector.xpath('./td[2]/text()').get()
# ip = selector.xpath('./td[1]/text()').getall() #(多个) .表示在当前节点下继续选择 和 selectors
# port = selector.xpath('./td[2]/text()').get()
# ip = selector.xpath('./td[1]/text()').extract_first() # .表示在当前节点下继续选择 和 selectors
# port = selector.xpath('./td[2]/text()').extract_first()
# print(ip,port)
items = {
"ip":ip
"port":port
}
yield items
#翻页操作 寻找翻页的网址标签
next_page = response.xpath('//a[@class="next_page"]/@href').get()
if next_page:
print(next_page)
#拼接网址
# next_url = "http://cn-proxy.com/" + next_page
next_url = response.urljojin(next_page)
#发出请求 Requext calback 是回调函数 就是将请求得到的响应交给自己处理
yield scrapy.Request(next_url,callback=self.parse) #生成器 递归
[Scrapy入门]
*scrapy是框架 类似于车子 原则上来说会开车就行 但是作为爬虫工程师来说还得会修车 改装
*采用异步框架 实现高效率的网络采集(并发等)
*最强大的爬虫框架 没有之一
[Scrapy安装]
* pip install scrapy -> VC++14.0 Twisted(关键字)
解决方法:离线安装 pip install xxx.whl
*scrapy bench 测试是否真正安装成功 报错 ———> win32
解决放法:pip install pywin32
*报错 automat 20.2.0 has requirement attrs>=19.2.0, but you'll have attrs 18.1.0 which is incompatible.
解决方法 pip install attrs==19.3 pip install scrapy
[Scrapy入门实战案例]
采集目标:ip代理 包括 ip port
1 新建项目
scrapy startproject xxxxSpider(项目名字)
2 创建爬虫
scrapy genspider xxxx(爬虫名字) xxxxxx.com(域名)
注意:
*爬虫名字不要和项目名字一样
*网站域名是允许爬虫采集的域名
- baidu.com zhihu.com
[解释爬虫文件]
import scrapy #导入scrapy
# 创建爬虫类 并且继承自scrapy.Spider --> 最基础的类 另外几个各类都是继承自这个类
class ProxySpider(scrapy.Spider):
name = 'proxy' # 爬虫名字--> 必须唯一
allowed_domains = ['cn-proxy.com'] # 允许采集的域名
start_urls = ['http://cn-proxy.com/'] # 开始采集的网站
# 解析响应数据 提取数据 或者网址等 response 就是网页源码
def parse(self, response):
pass
3 分析网站
*提取数据
- 正则表达式(基础 必会 难掌握)
- XPath --> 从HTML中提取数据
- CSS --> 从HTML中提取数据
- response.xpath(xpath语法).get()
- get() 是得到一个元素
-getall() 是多个元素
4 运行爬虫
scrapy crawl xxxx(爬虫名字)
Request()发出请求 类似于requests.get()
callvack 是将发出去的请求得到的响应还交给自己处理
注意:回调函数不要写() 只写函数名
执行并保存数据
scrapy crawl xxxx(爬虫名字) -o xx(文件名).json JSON格式
scrapy crawl xxxx(爬虫名字) -o xx(文件名).csv csv格式