爬取思路,
爬取搜狗微信公众号内容,爬取第一层url时请求太快出现验证码,我这里用的蘑菇云代理,并在程序中我判断什么情况下是否+代理,
做到合理运用代理ip。
爬取第二层url时验证码出现次数更严重(和第一层验证码完全不一样),一开始也用更换代理,但是感觉不怎么解决问题,后来利用selenium自动打开该页面,并把
验证码图片抓取下来,然后发现抓下来的并不是页面中的真实验证码,估计是网站加密的原因。
后来利用selenium直接保存截屏整张页面,再利用python的pil包把验证码图片截取下来,发送到云打码,
最后发现, 成功解决问题。

import requests
from lxml import etree
import time
import json
import random
from dama import yundama
from selenium import webdriver
from PIL import Image #处理图片包
import pymysql
import re
from requests.exceptions import ConnectionError #=============================代理ip封装函数=======================
def get_ip(): #代理Ip
url = 'http://piping.mogumiao.com/proxy/api/' #代理ip的api接口
time.sleep(random.uniform(1, 3))
response = requests.get(url=url).json()
n = response['msg'][0]
ip = {}
ip['http'] = 'http://'+n['ip']+':'+n['port']
return ip
#===================================================================
#随机更换请求头
user_agent = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)'
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
'Opera/8.0 (Windows NT 5.1; U; en)',
'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50'
]
#===================================================================
#链接数据库
db = pymysql.Connect(
db = 'test',
user = 'root',
port = 3306,
host = 'localhost',
password = 'mysql',
charset = 'utf8'
)
cursor = db.cursor() proxi = None #定义全局变量代理用
count = 0 #计数用
def sougou(page):
global proxi,count #改变全局变量 #可以修改关键字查询其它
url = 'http://weixin.sogou.com/weixin?query=python&_sug_type_=&s_from=input&_sug_=n&type=1&ie=utf8&page='+str(page)
headers = {
'Referer': 'http://weixin.sogou.com/weixin?type=1&query=python&ie=utf8&s_from=input&_sug_=n&_sug_type_=1&w=01015002&oq=&ri=5&sourceid=sugg&sut=0&sst0=1540733222633&lkt=0%2C0%2C0&p=40040108',
'User-Agent': random.choice(user_agent),
'Cookie': 'CXID=04C14DAB703E117FA82047F41148A82D; SUID=82F4FB723665860A5AB30BA8000211FB; SUV=1526707509991840; UM_distinctid=16376dbdee02b1-0820fe9948d64e-c343567-100200-16376dbdee4fb8; IPLOC=CN1100; usid=ue2M7rhDvZ5zfSvQ; pgv_pvi=1717965824; dt_ssuid=4873588560; ssuid=9294144357; pex=C864C03270DED3DD8A06887A372DA219231FFAC25A9D64AE09E82AED12E416AC; weixinIndexVisited=1; ld=Vkllllllll2bQuDilllllVs2PuGlllllNYkuOkllll9lllllVklll5@@@@@@@@@@; ad=vkllllllll2b8Y4nlllllVsyx@tlllllNYkuskllll9lllllpVxlw@@@@@@@@@@@; ABTEST=8|1540692132|v1; GOTO=Af71175-1502; SUIR=1AC841BDC9CDB1889FD40AC7C92328E1; SNUID=DD51FF0D787D0E234D0D8342788E1DC9; sct=38; JSESSIONID=aaaFhG5t_2zIAdtqom-Aw; Hm_lvt_dde6ba2851f3db0ddc415ce0f895822e=1540807114,1540807224,1540808537,1540816279; Hm_lpvt_dde6ba2851f3db0ddc415ce0f895822e=1540816279'
} #注意cookie存活时长 try: #捕获异常(主要针对错误的代理ip)
if proxi: #判断加上代理则执行
response = requests.get(url=url, headers=headers, proxies=proxi)
else: #none为不加代理
response = requests.get(url=url, headers=headers, proxies=proxi)
html = etree.HTML(response.text)
datas = html.xpath("//p[@class='tit']/a")
#-------------------------------------------------------------------
if len(response.text) > 5500:#如果不是验证码页面
for i in datas:
gongzhonghao = ''.join(i.xpath('.//text()')) #公众号
gongzhonghao_url = i.xpath('.//@href')[0] #公众号url
list_response = requests.get(url=gongzhonghao_url, headers=headers) if len(list_response.text) > 6500: #如果不是验证码页面
res = re.compile(r'var msgList = (.*?)};', re.S) #正则取出json数据
lists = json.loads(res.findall(list_response.text)[0] + '}')['list'] #转python格式
for i in lists:
title_name = i['app_msg_ext_info']['title'] #获取文章标题
content_url = 'https://mp.weixin.qq.com' + i['app_msg_ext_info']['content_url'].replace('amp;', '')#取出内容也的url并处理
content_response = requests.get(url=content_url, headers=headers)#请求内容页面
# time.sleep(random.uniform(1,3)) #建议打开随机休眠时间
html1 = etree.HTML(content_response.text)
contents = ''.join(html1.xpath('//*[@id="js_content"]//text()')).strip() #文章内容
img = html1.xpath('//*[@id="js_content"]//img/@data-src') #图片
if len(img)==0: #判断页面是否有无图片
imgs = '图片暂无'
else:
imgs = img
# -------------------------------------------------------------------
#数据库查询是否已存在
check = 'select * from weixin where title="{}"'.format(title_name)
result = cursor.execute(check)#返回查询语句的影响行数
if result == 0:
#不存在则执行添加sql语句
sql = 'insert into weixin VALUES (0,%s,%s)'
cursor.execute(sql, [title_name, re.sub(r'\W', '', contents)])#替换文章特殊字符
count += 1 #计数
print(count, title_name)
else:
print('{}----------已存在'.format(title_name))
db.commit()#数据库提交 else:#验证码页面则重新发起请求
web = webdriver.Chrome()
web.maximize_window() #页面最大化
web.get(list_response.url) #请求验证码页面
web.save_screenshot("D:\\quan.png")#截取全屏并保存到该路径
imgs = web.find_element_by_id('verify_img') #验证码页面定位验证码图片元素位置
#第一步取参数
place = imgs.location #验证码的坐标位置
size = imgs.size #验证码的大小
#第二部整理参数(数据为元组)
rangle = (int(place['x']), int(place['y']), int(place['x'] + size['width']),
int(place['y'] + size['height'])) # 写成我们需要截取的位置坐标
#第三步导入PIL,打开截图
i = Image.open("D:\\quan.png")
#第四部进行抠图操作
frame4 = i.crop(rangle) # 使用Image的crop函数,从截图中再次截取我们需要的区域
#第五步 保存抠下来的验证码
frame4.save('D:\\cropped.png') # 保存我们接下来的验证码图片 进行打码
web.find_element_by_id('input').send_keys(yundama())#调用云打码返回参数并发送到input框
time.sleep(1)
web.find_element_by_id('bt').click()#点击提交
time.sleep(2)
web.close() #关闭浏览器 else:#验证码页面文本长度低于5500
proxi = get_ip() #代理生效
print('第一个页面{}正在使用代理ip'.format(proxi))
sougou(page) #递归调用本身 except ConnectionError: #代理ip不能用的
proxi = get_ip()
print('{}请求出错,更换代理ip'.format(proxi))
sougou(page) if __name__ == '__main__':
  for page in range(1,7):#循环页码
  sougou(page)

requests利用selenium,代理Ip,云打码,验证码抠图操作 爬取搜狗微信公众号内容的更多相关文章

  1. 代理 IP 云打码平台的使用

    代理ip 获取代理ip的网站: 快代理 西祠代理 www.goubanjia.com #代理ip import requests headers = { 'User-Agent':'Mozilla/5 ...

  2. Android lifecyle 源码解剖 - gdutxiaoxu的博客(微信公众号 stormjun94)

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/gdutxiaoxu/article/det ...

  3. C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

    一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...

  4. 利用OpenShift托管Node.js Web服务进行微信公众号开发

    最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...

  5. C#版微信公众号支付|微信H5支付|微信扫码支付问题汇总及解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存.代码在文章结尾处,有需要的 ...

  6. asp.net core 微信公众号支付(扫码支付,H5支付,公众号支付,app支付)之3

    在微信公众号中访问手机网站,当需要调用支付时候无法使用H5支付,只有使用微信公众号支付,使用公众号支付用户必须关注该公众号同时该公众号必须开通公众号支付功能. 1.获取用户的OpenId ,参考之前写 ...

  7. [Python爬虫] 之十五:Selenium +phantomjs根据微信公众号抓取微信文章

    借助搜索微信搜索引擎进行抓取 抓取过程 1.首先在搜狗的微信搜索页面测试一下,这样能够让我们的思路更加清晰 在搜索引擎上使用微信公众号英文名进行“搜公众号”操作(因为公众号英文名是公众号唯一的,而中文 ...

  8. 用wxpy管理微信公众号,并利用微信获取自己的开源数据。

    之前了解到itchat 乃至于 wxpy时 是利用tuling聊天机器人的接口.调用接口并保存双方的问答结果可以作为自己的问答词库的一个数据库累计.这些数据可以用于自己训练. 而最近希望获取一些语音资 ...

  9. 利用python 实现微信公众号群发图片与文本消息功能

    在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_token.如下: #获取微信access_token def get_token(): paylo ...

随机推荐

  1. ceph 创建和删除osd

    ceph 创建和删除osd 1.概述         本次主要是使用ceph-deploy工具和使用ceph的相关命令实现在主机上指定磁盘创建和删除osd,本次以主机172.16.1.96(主机名ha ...

  2. 第二章 MySQL的安装与配置(待续)

    ·······

  3. elastic(9)映射

    转自:https://www.cnblogs.com/eryuan/p/7389728.html?utm_source=debugrun&utm_medium=referral elastic ...

  4. 13-EasyNetQ之发布者确认

    AMQP发布消息默认情况下是非事务性的,不能确保你的消息真正送达代理.AMQP可以去指定事务性发布,但是RabbitMQ这样会非常慢,我们没有让EasyNetQ API去支持此功能.为了高效的确保投递 ...

  5. 关于FPGA设计16位乘法器的两…

    原文地址:关于FPGA设计16位乘法器的两种算法作者:ChrisChan 部分原代码如下: 用特权的右移算法虽复杂点,但节省不少LEs,如下图: 用左移算法尽管浅显易懂,但因每次都会从最右端移位,会占 ...

  6. 通过helloworld来认识下backbone

    Backbone主要涉及3部分:model,collection和view.而这个框架的优势在于:数据与视图分离,通过操作model来自动更新view. 根据我的个人经验,直接写个简单的例子是最最直观 ...

  7. 【转发】徐汉彬:Web系统大规模并发——电商秒杀与抢购

    徐汉彬:Web系统大规模并发——电商秒杀与抢购 发表于2014-12-02 09:30| 73110次阅读| 来源CSDN| 114 条评论| 作者徐汉彬 问底徐汉彬大数据 摘要:电商的秒杀和抢购,从 ...

  8. java简单的测试方法执行了多少时间

    (1)以毫秒为单位的 long startTime = System.currentTimeMillis(); // 获取开始时间 // doThing(); // 测试的代码段 long endTi ...

  9. Visual Studio + C# + Xamarin = iOS/Android/Windows Apps

    Visual Studio 跨平台開發實戰 (1) -- Hello Xamarin! 前言 應用程式發展的腳步,從來沒有停過.從早期的 Windows 應用程式, 到網路時代的 web 應用程式,再 ...

  10. Python基础 之列表、字典、元组、集合

    基础数据类型汇总 一.列表(list) 例如:删除索引为奇数的元素 lis=[11,22,33,44,55] #第一种: for i in range(len(lis)): if i%2==1: de ...