爬取思路,
爬取搜狗微信公众号内容,爬取第一层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. Android 4 学习(16):Database and Content Providers

    参考<Professional Android 4 Development> Database and Content Providers Android Database简介 Andro ...

  2. OK6410&nbsp;linux系统遇到的BUG总结

    经过一段时间使用OK6410 256M RAM 2G nand Flash碰见了不少问题. 所以特意开本贴一起交流.大家有什么BUG解决的可以跟上本帖.求助的请另开贴.勿跟本帖.谢谢.请谅解!!! 希 ...

  3. The centos disc was not found in any of your drives.Please insert the centos disc and press OK to retry

    查看虚拟机设置中关于CDROM的选项,将CDROM的状态改为已连接,不要奇怪,勾选上之后再按下OK就好了

  4. Timer的缺陷

  5. thinkphp对mysql的CURD操作

    利用thinkphp(3.2.3)来操作数据库,首先要连接数据库.我们需要对某数据库写一个配置文件,thinkphp会根据该配置文件自动连接上数据库.而model文件就不用自定义,内置的即可解决问题. ...

  6. 图论算法》关于SPFA和Dijkstra算法的两三事

    本来我是想把这两个算法分开写描述的,但是SPFA其实就是Dijkstra的稀疏图优化,所以其实代码差不多,所以就放在一起写了. 因为SPFA是Dijkstra的优化,所以我想来讲讲Dijkstra. ...

  7. Linux3一些文件操作命令more,less,pr,head,tail,wc

    查看文件内容命令: more和less 用cat命令可以查看文件.有时候文件太大,可以用管道符号|配合more或者less一同使用. cat  <文本文件名称>|more cat  < ...

  8. opennebule 创建cdrom数据发送

    {","csrftoken":"b9b5026f1a92180b789971ed8e21d28b"}

  9. Linux查看内存,负载状态

    Linux查看内存,负载状态 查看内存使用情况  www.ahlinux.com cat /proc/meminfo MemTotal:       16332644 kB MemFree:     ...

  10. Luogu 2403 [SDOI2010]所驼门王的宝藏

    BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...