学习目标:

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的数据存入到数据库)相关推荐

  1. 利用python简单分析抓包数据

    利用python简单分析抓包数据 wireshark的数据 先读一行看看长啥样 import json data_file = r'E:\download\data.json' with open(d ...

  2. Python爬虫爬取静态网页实例一:爬取内涵段子吧上的段子

    最近在学爬虫,这里用实例来与大家分享一下我学习的经验. 这里讲一个爬取静态网页内容的实例,Python一般利用正则表达式爬取静态静态网页的内容,而且因为静态网页源代码固定,不会发生变化,所以比较简单, ...

  3. Python学习笔记:通过Headers字段模拟浏览器访问亚马逊界面爬取

    学习笔记:哔哩哔哩 Python 爬虫视频教程全集(62P)| 6 小时从入门到精通 0. 学习视频地址 https://www.bilibili.com/video/BV1pt41137qK?p=1 ...

  4. 请访问豆瓣电影网站,爬取4~10部电影信息(电影名、导 演、演员、海报url链接,预报片视频链接),并结合GUI界面展现电影信息,并可以根据选择的电影名, 下载指定预告片视频到本地并显示预告片。GUI

    请访问豆瓣电影网站,爬取4~10部电影信息(电影名.导 演.演员.海报url链接,预报片视频链接),并结合GUI界面展现电影信息,并可以根据选择的电影名, 下载指定预告片视频到本地并显示预告片.GUI ...

  5. 使用python简单的抓取网络小说

    在读完kcl的语言班后,终于有了大块的空闲时间,想着写一点程序练练手,就花费一点时间写了一个python的小爬虫,很简单,上代码. #!/usr/bin/env python3 # -*- codin ...

  6. Python简单的抓取静态网页内容

    import requests from bs4 import BeautifulSoup res = requests.get('http://news.sina.com.cn/china/')#获 ...

  7. python简单实现抓取英雄联盟皮肤原画:老玩家都哭了!

    写在前面: 自学py已经快两个多月了吧,作为新手,就是敢于尝试,之前有看到有人抓取王者荣耀皮肤的,但是作为一个联盟老玩家,还是想搞一个抓取联盟皮肤的,下面分享一下我自己的学习经过,如果有错误或者建议, ...

  8. python搜索网页特定区域内容_Python爬取练习:指定百度搜索的内容并提取网页的标题内容...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章源于白菜学python ,作者小白菜 刚接触Python的新手.小白,可以复制下面的链接去 ...

  9. python爬虫爬取微信网页_python下爬虫爬取微信公众号文章给网站的相关操作与问题...

    一.出发点 在dodo团队知乎号开刊文章中已介绍过本团队平常的实际工作,我们是一个从事游戏与金融结合的项目开发与运营团队.技术上主要是从事游戏分期.玩后付支付插件.游戏充值app等前后端开发,主要使用 ...

最新文章

  1. 在线文档预览方案-office web apps
  2. 安卓项目打开有时候manifests不见了_【必看】暴力0鲁项目详细操作及玩法如何跳过广告,不分享群等...
  3. 软件研发中的N条原则
  4. tomcat GET 编码疑惑
  5. Samba Linux 和windows 共享
  6. footer代码html,css如何实现footer定位(完整代码)
  7. php内存泄漏的后果,记一次php内存泄漏的排查经过
  8. 钉钉 6.0 开放底层“协同框架” 开发多人实时协作程序像编本地程序一样简单...
  9. 小米开源移动端深度学习框架MACE,自主研发,专为IoT设备优化
  10. Visual Studio.NET 无法创建或打开应用程序之解决方法
  11. 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密
  12. 移动互联网时代,如何优化你的网络 —— 域名解析篇
  13. java, android的aes等加密库
  14. 图:智能手机Android系统的评委专用的比赛打分客户端,开发进行中...
  15. unity编辑器拓展(三) 预制体(Image)资源引用查找
  16. 阶乘的传统流程图 c语言,C语言算法与流程图.ppt
  17. 电磁阀原理及控制方式
  18. 浏览器主页被更改成7654主页
  19. 克转换成千克怎么算python_斤公斤千克的换算(克和公斤怎么转换)
  20. Spring Data JDBC、引用和聚合

热门文章

  1. JDBI -- 简介
  2. CSS隐藏元素的方法
  3. kafka实战-消费者offset重置问题
  4. 浅谈Memory barrier
  5. 程序员+本硕博——高效软件
  6. chatgpt赋能python:Python怎么更换接码平台
  7. element图片滚动
  8. 前景无限的golang,分分钟高薪offer
  9. 【沃顿商学院学习笔记】商业基础——Operation Management:03运营管理活动中流程数据的详细分析
  10. 中国剩余定理(孙子定理)的算法实现(基于miracl大数运算库)