python—简单数据抓取七(采取蘑菇API代理设置scrapy的代理IP池并利用redis形成队列依次使用,利用ip池访问网页并将scrapy爬取转移到items的数据存入到数据库)
学习目标:
Python学习二十七—简单数据抓取七
学习内容:
1、采取蘑菇API代理设置scrapy的代理IP池并利用redis形成队列依次使用
2、利用ip池访问网页并将scrapy爬取转移到items的数据存入到数据库
3、注意事项
1、采取蘑菇API代理设置scrapy的代理IP池并利用redis形成队列依次使用
- 以安居客为例(安居客会根据访问的IP地址对用户进行限制)
1、首先创建一个爬取安居客全站的项目 - 在cmd窗口cd到项目需要保存的位置,输入:scrapy startproject fangzi,创建fangzi项目
- cd到fangzi项目里面,然后输入:scrapy genspider anjuke tianjin.anjuke.com/sale/p1/?from=navigation,创建anjuke爬虫
- 创建run运行文件
2、创建利用蘑菇代理API代理获取IP地址池的get_ip.py文件
import time
import requests
import redis# 在死循环中不断获取API代理的IP地址
while True:# 连接redis数据库r = redis.Redis(host='127.0.0.1', port=6379, db=0)# 判断数据库的IP个数是否满if r.llen('proxy_ip') < 10:# 获取API链接中信息,并且转换为json数据source = requests.get('蘑菇代理的API链接').json()# 根据获取的API信息,拿出需要的IP地址和port端口for i in source['msg']:# 按照格式将两个信息进行拼接ip = i['ip'] + ':' + i['port']print(ip)# 插入到redis数据库中r.lpush('proxy_ip', ip)else:# 延迟3秒,之后打印IP池的状态time.sleep(3)print('代理IP池已满!!!')
3、在middlewares.py文件中进行相关的请求与返回的配置
- middlewares文件中需要连接数据库,在最前端输入如下:
import redis
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
- middlewares文件中网页访问链接的时候带上proxy,找到process_request输入如下:
def process_request(self, request, spider):
# ip地址从redis数据库中取出,并转码为utf8ip = r.lpop('proxy_ip').decode('utf8')print(ip)# 请求链接时带上该proxyrequest.meta['proxy'] ='https://' + ipreturn None
- middlewares文件中网页访问返回的信息,在response中进行处理,找到process_response输入如下:
def process_response(self, request, response, spider):# Called with the response returned from the downloader.# 判断返回信息是否为200正常状态if response.status == 200:# 同时根据实际页面的大小为700判断是否返回的是正常页面,可以在请求的页面上用len方法获取到大小if len(response.text) > 750000:# 将正常请求网页的链接进行分割取出ip和port回收到redis数据库ip = request.meta['proxy'].split('//')[-1]# 将正常能用的ip和port重新插回到redis数据库r.lpush('proxy_ip', ip)# 并返回正常的信息return response# 重回调度队列return request
- middlewares文件中如果请求不到正确的网页信息,就到process_exception,重新获取新的IP进行新的请求,输入如下:
def process_exception(self, request, exception, spider):# Called when a download handler or a process_request()# (from other downloader middleware) raises an exception.ip = r.rpop('proxy_ip').decode('utf8')print(ip)request.meta['proxy'] = 'https://' + ip# Must either:# - return None: continue processing this exception# - return a Response object: stops process_exception() chain# - return a Request object: stops process_exception() chainreturn request
4、在setting.py文件中,进行相关的配置
- 请求下载页面内容的延迟
DOWNLOAD_DELAY = 2
- 打开代理IP的设置
DOWNLOADER_MIDDLEWARES = {'fangzi.middlewares.FangziDownloaderMiddleware': 543,
}
2、利用ip池访问网页并将scrapy爬取转移到items的数据存入到数据库
1、利用设置好的IP地址池,来请求安居客网页避免因为同一个IP地址频繁访问而被封掉
import scrapy
from fangzi.items import FangziItemclass AnjukeSpider(scrapy.Spider):name = 'anjuke'# 利用代理ip以及携带header头访问安居客网页,并且关系到下面的get_ip方法,start_requests方法获取的东西都传给get_ip方法def start_requests(self):yield scrapy.Request('https://tianjin.anjuke.com/sale/p1/?from=navigation', self.first, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}, dont_filter=True)# 从安居客二手房的第一页获取到所有页面的信息,然后抓取全站的房源信息def first(self, response):one_type = response.xpath('//*[@id="__layout"]/div/section/section[2]/section/div[1]/section/ul[2]/li/a/@href').extract()[1:]for hrefs in one_type:yield scrapy.Request(hrefs, self.get_href)def get_href(self, response):two_type = response.xpath('//*[@id="__layout"]/div/section/section[2]/section/div[1]/section/ul[3]/li/a/@href').extract()[1:]for hrefs in two_type:yield scrapy.Request(hrefs, self.get_page)def get_page(self, response):max_page = response.xpath('//li[@class="page-item last"]/a/text()').extract_first('1')for page in range(1, int(max_page)+1):last_href = response.url.replace('/?', '/p'+str(page)+'/?')yield scrapy.Request(last_href, self.get_ip)def get_ip(self, response):# 实例化item购物车item = FangziItem()# 提取xpath的公共部分base = response.xpath('//div[@class="property"]')for i in base:# xpath到房源信息的标题title = i.xpath('a/div[2]/div[1]/div[1]/h3/text()').extract_first()# xpath到房源信息的房型house_type = ''.join(i.xpath('a/div[2]/div[1]/section/div[1]/p[1]/span/text()').extract())# xpath到房源信息的面积house_size = i.xpath('a/div[2]/div[1]/section/div[1]/p[2]/text()').extract_first().strip()print(title, house_type, house_size)# 将获取的三个信息合并成列表,并根据','分割lists = 'title,house_type,house_size'.split(',')# 将获取的内容插入到item中,这里用了一个eval的方法for i in lists:item[i] = eval(i)yield item
- 同时item.py文件的内容
import scrapyclass FangziItem(scrapy.Item):title = scrapy.Field()house_type = scrapy.Field()house_size = scrapy.Field()
2、将scrapy项目连接到数据库,并将获取的信息存入到数据库中
- 在settings.py文件中进行数据库相关信息的配置,在最后输入如下:
DB_USER = 'root'
DB_PWD = '1234'
HOST = '127.0.0.1'
DB_NAME = 'anjuke'
- 记得将setting文件中的打开
ITEM_PIPELINES = {'fangzi.pipelines.FangziPipeline': 300,
}
- 在pipliens.py文件中获取item购物车中的信息,并存入到mysql数据库中:
import pymysqlclass FangziPipeline(object):# 初始化相关的数据库配置信息def __init__(self, user, password, host, db_name):self.user = userself.password = passwordself.host = hostself.db_name = db_name# 利用修饰符在不形成实例化的情况下直接调用settings文件中数据库配置信息@classmethoddef from_crawler(cls, crawler):return cls(user=crawler.settings.get('DB_USER'), password=crawler.settings.get('DB_PWD'), host=crawler.settings.get('HOST'), db_name=crawler.settings.get('DB_NAME'))def open_spider(self, crawler):# 该方法继承类的默认属性,并得到数据库配置信息,连接到mysql数据库self.db = pymysql.connect(user=self.user, password=self.password, host=self.host, db=self.db_name, charset='utf8')# 测试数据库的连通性self.db.ping(reconnect=True)# 使用cursor()方法获取数据库的操作游标self.cursor = self.db.cursor()def process_item(self, item, spider):# 将item中的数据插入到设置好的mysql数据库中sql = "insert into anjuke(title, house_type, house_size) VALUE ('{}', '{}', '{}')".format(item['title'], item['house_type'], item['house_size'])# 执行该插入数据命令self.cursor.execute(sql)# 提交执行self.db.commit()return itemdef close_spider(self, spider):# 关闭数据库self.db.close()
3、注意事项
1、ip池利用了redis数据库
2、获取的数据存储利用了mysql数据库
3、运行时,首先运行get_ip.py文件,方便获取新鲜的ip地址,再运行run.py文件
4、抓取安居客全站的信息时,注意各个分类以及相关最大页数的提取
python—简单数据抓取七(采取蘑菇API代理设置scrapy的代理IP池并利用redis形成队列依次使用,利用ip池访问网页并将scrapy爬取转移到items的数据存入到数据库)相关推荐
- 利用python简单分析抓包数据
利用python简单分析抓包数据 wireshark的数据 先读一行看看长啥样 import json data_file = r'E:\download\data.json' with open(d ...
- Python爬虫爬取静态网页实例一:爬取内涵段子吧上的段子
最近在学爬虫,这里用实例来与大家分享一下我学习的经验. 这里讲一个爬取静态网页内容的实例,Python一般利用正则表达式爬取静态静态网页的内容,而且因为静态网页源代码固定,不会发生变化,所以比较简单, ...
- Python学习笔记:通过Headers字段模拟浏览器访问亚马逊界面爬取
学习笔记:哔哩哔哩 Python 爬虫视频教程全集(62P)| 6 小时从入门到精通 0. 学习视频地址 https://www.bilibili.com/video/BV1pt41137qK?p=1 ...
- 请访问豆瓣电影网站,爬取4~10部电影信息(电影名、导 演、演员、海报url链接,预报片视频链接),并结合GUI界面展现电影信息,并可以根据选择的电影名, 下载指定预告片视频到本地并显示预告片。GUI
请访问豆瓣电影网站,爬取4~10部电影信息(电影名.导 演.演员.海报url链接,预报片视频链接),并结合GUI界面展现电影信息,并可以根据选择的电影名, 下载指定预告片视频到本地并显示预告片.GUI ...
- 使用python简单的抓取网络小说
在读完kcl的语言班后,终于有了大块的空闲时间,想着写一点程序练练手,就花费一点时间写了一个python的小爬虫,很简单,上代码. #!/usr/bin/env python3 # -*- codin ...
- Python简单的抓取静态网页内容
import requests from bs4 import BeautifulSoup res = requests.get('http://news.sina.com.cn/china/')#获 ...
- python简单实现抓取英雄联盟皮肤原画:老玩家都哭了!
写在前面: 自学py已经快两个多月了吧,作为新手,就是敢于尝试,之前有看到有人抓取王者荣耀皮肤的,但是作为一个联盟老玩家,还是想搞一个抓取联盟皮肤的,下面分享一下我自己的学习经过,如果有错误或者建议, ...
- python搜索网页特定区域内容_Python爬取练习:指定百度搜索的内容并提取网页的标题内容...
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章源于白菜学python ,作者小白菜 刚接触Python的新手.小白,可以复制下面的链接去 ...
- python爬虫爬取微信网页_python下爬虫爬取微信公众号文章给网站的相关操作与问题...
一.出发点 在dodo团队知乎号开刊文章中已介绍过本团队平常的实际工作,我们是一个从事游戏与金融结合的项目开发与运营团队.技术上主要是从事游戏分期.玩后付支付插件.游戏充值app等前后端开发,主要使用 ...
最新文章
- 在线文档预览方案-office web apps
- 安卓项目打开有时候manifests不见了_【必看】暴力0鲁项目详细操作及玩法如何跳过广告,不分享群等...
- 软件研发中的N条原则
- tomcat GET 编码疑惑
- Samba Linux 和windows 共享
- footer代码html,css如何实现footer定位(完整代码)
- php内存泄漏的后果,记一次php内存泄漏的排查经过
- 钉钉 6.0 开放底层“协同框架” 开发多人实时协作程序像编本地程序一样简单...
- 小米开源移动端深度学习框架MACE,自主研发,专为IoT设备优化
- Visual Studio.NET 无法创建或打开应用程序之解决方法
- 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密
- 移动互联网时代,如何优化你的网络 —— 域名解析篇
- java, android的aes等加密库
- 图:智能手机Android系统的评委专用的比赛打分客户端,开发进行中...
- unity编辑器拓展(三) 预制体(Image)资源引用查找
- 阶乘的传统流程图 c语言,C语言算法与流程图.ppt
- 电磁阀原理及控制方式
- 浏览器主页被更改成7654主页
- 克转换成千克怎么算python_斤公斤千克的换算(克和公斤怎么转换)
- Spring Data JDBC、引用和聚合