一、IP代理池(比较简陋,后续更新)
验证ip,proxies用的是两个协议,http和https都要有
import re
import requests
url = 'https://tool.lu/ip'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
}
proxies ={
'http':'47.243.190.108:7890',
'https':'47.243.190.108:7890'
}
res = requests.get(url=url,headers=headers,proxies=proxies,timeout=3).text
ip = re.search(r'[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}',res,flags=re.S).group(0)
print(ip)
二、python爬虫之scrapy框架
先贴一张图
基本命令
- 生成基本框架
scrapy startproject myspider
- 创建爬虫文件
cd myspider
scrapy genspider -t crawl SpiderName DomaimName
ps:上面加的参数 -t crawl 是创建crawlspider,里面的Rule方法可以帮助提取url
例:笔趣阁,全站爬取
- 首先,拿到更多的连接,然后,进入这个分类中,拿到分页的url,再然后,拿到每页的书籍url,并进入详情页
- 使用crawlspider,只需要三行就能拿到
- 解释一下上面的代码
- LinkExtractor :提取器(就是提取页面url的,直接将页面url的规则放进去就行)
- callback : 回调函数,就是提取页面内容,提取url是上面那个方法,这个就用在提取详情页(数据)的时候用
- follow : 这么想,提取到的页面(page)的url,是不是还要再提取一边每个书籍的url,然后再提取详情页面数据,这个时候,就要加个follow=True
- 运行
scrapy crawl SpiderName
- 运行后的数据就在
- 注意看,这个函数名是parse_item()
- 如果是不加任何参数的框架,生成的函数时 parse()
scrapy stratproject myspider
response的一些返回值和参数
- 返回值
- 就是requests的返回参数,url,headers,status
- response.body.decode() : 返回文本对象
- headers :请求头
- 参数
- meta :这个参数主要用于传递item字典对象
- callback:回调函数(有多页数据或有详情页)
- dont_filter : 默认为False,去重
- proxy : 设置代理,一般在item字典中
request.meta['proxy'] = 'https://' + 'ip:port'
- setting中的配置
- download_timeout : 和request模块的timeout一样,设置超时
- max_retry_times : 最大请求次数(默认两次)
- dont_retry : 请求失败的url不再请求
- dont_merge_cookies : scrapy会自动保存返回的cookies,自己添加或不用的话就设置True
- bindaddress :输出绑定IP
- ROBOTSTXT_OBEY:是否遵守协议
- LOG_LEVEL:打印日志等级
- ERROR
- WARNING
- INFO
- CONCURRENT_REQUESTS :开启线程数
- DOWNLOAD_DELAY:下载延迟
- DEFAULT_REQUEST_HEADERS:开启后覆盖默认的请求头
- 下载中间件和爬虫中间件后面的参数越小,优先级越高
scrapy基本用法
设置run文件(setting同级)
from scrapy import cmdline
cmdline.execute('scrapy crawl xt'.split())
重写方法 start_requests
更改中间件middlewares
随机UA代理
fake_useragent 是一个包,pip install一下
from fake_useragent import UserAgent
class DouyinxingtuUserAgentDownloaderMiddleware:
def process_request(self, request, spider):
agent = UserAgent(path='fake_useragent_0.1.11.json').random
request.headers['User-Agent'] = agent
设置用户代理ip
class DouyinxingtuProxiesDownloaderMiddleware:
def process_request(self, request, spider):
porixList = getIp()
self.porix = random.choice(porixList) # 116.208.24.72:8118
request.meta['proxy'] ='https://'+self.porix
print(request.meta)
# 如果报错,就返回
def process_exception(self, request, exception, spider):
print('删除数据库的值')
return request
设置cookie(scrapy中间件里设置cookie要的是字典格式)
上面是直接从浏览器复制的,将字符串转换成字典
class DouyinxingtuCookieDownloaderMiddleware:
def process_request(self, request, spider):
cookie = self.get_cookie()
cookies = dict([l.split("=", 1) for l in cookie.split("; ")])
request.cookies=cookies
基于管道存储
先打开setting配置
这个是pipelines里面的类名
管道类配置
# mysql数据库存储
class DouyinxingtuPipelineMysqlSave:
fp=None
def open_spider(self,spider):
print('爬虫开始')
# 连接数据库
pass
def process_item(self,item,spider):
print(item) # 这个是items中的item
pass
def close_spider(self,spider):
print('爬虫结束')
pass
个人习惯,引入items中的类
-
引入类,并赋值
item = DouyinxingtuItem() item['data'] = response['data']
-
items
-
保存数据库(mysql,原生sql)