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


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; [email protected]@@@@@@@@@; [email protected]@@@@@@@@@@@; 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)

原文地址:https://www.cnblogs.com/lvye001/p/9873796.html

时间: 2024-08-04 12:43:00

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

爬取微信公众号内容——绘制词云

写在前面的话 前段时间写了一篇通过搜狗引擎获取微信公众号的文章,最近又看了一个网易云歌词绘制词云的程序 然后我就想,能否把这两者结合起来呢 还好经历几多波折终于把这个东西给弄出来了. 其实中间的实现不是很难, 关键是环境搭建实在是太困难了 好了,先把代码以及效果图奉献上吧 代码 weixin_spider.py #!/usr/bin/python # coding: utf-8 #这三行代码是防止在python2上面编码错误的,在python3上面不要要这样设置 import sys reloa

python 网络爬虫session处理cookie,代理IP,云打码介绍

一.基于requests模块的cookie操作(session处理cookie) cookie概念:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie. cookie作用:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面.我们经常会在此时设置30天内记住我,或者自动登录选项.那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,

如何利用动态代理IP来做SEO(网络营销)

对动态代理IP大家都不陌生,今天我们来聊下如何利用动态代理ip来做SEO优化.其实除了SEO很多网络营销也都需要用到代理IP,因为很多网络营销的用户都知道,投票.注册帐号.发帖子等工作,都需要用到代理IP这个工具,才能毫无限制的操作. 动态代理IP对seo网站运营的影响: 我们在尝试运用动态代理IP之前,先说说咱们有什么常规化的seo优化方式去优化网站,其中要做好2点.第一点做好基本优化.第二点,深入认识搜索引擎: 1:做好基本优化:说的就是站内优化和站外优化.站内优化就是把网站优化的基础完善,

戏说西游||TCP/IP协议的由来(灵感来自“码农翻身”微信公众号)

引子 话说唐僧师徒四人西行取经,终于来到了西方极乐世界,取得真经,然而如何运回真经成了大问题,故事就这样展开了: 大唐王朝贞观八十一年,某日清晨 "悟空,为师带领你们终于取得真经,可是奈何如何将真经运回东土大唐呢?" "师傅,不用担心,俺老孙在筋斗云的基础上开发出了运输真经的法术--'TCP协议',只要严格学习俺法术的口诀,严格遵守俺定制的规则,只需要不断的往筋斗云上放经文,筋斗云就会自动往返运输真经,俺可保真经运回大唐!" "不愧是悟空,既然如此,悟能,

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

一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号密码.作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里分享一些我开发的用户绑定和验证码的一些心得.所需要的接口有基础的回复.网页授权.带参数二维码.

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

借助搜索微信搜索引擎进行抓取 抓取过程 1.首先在搜狗的微信搜索页面测试一下,这样能够让我们的思路更加清晰 在搜索引擎上使用微信公众号英文名进行“搜公众号”操作(因为公众号英文名是公众号唯一的,而中文名可能会有重复,同时公众号名字一定要完全正确,不然可能搜到很多东西,这样我们可以减少数据的筛选工作, 只要找到这个唯一英文名对应的那条数据即可),即发送请求到'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&_sug_=n&

如何通过微信公众号/微信号获取对应的二维码

方法一:利用游迹天下二维码工具获取   游迹天下彩色二维码工具 http://qr.uooji.com 已经提供了通过微信公众号或微信私人号的微信号获取对应二维码的功能.   使用方法很简单:打开 http://qr.uooji.com,在左侧导航提供了诸多二维码生成选项,第一项就是直接通过微信公众号或微信私号的微信号获取对应的二维码.   例如要获取游迹天下官方微信uooji_com的二维码图片,在输入框处输入uooji_com,然后点击右下角的“生成二维码”按钮即可以获得对应微信号的二维码.

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

最近写了一个微信的翻译机器人.用户只要关注该微信号,发送英文的消息,就能收到中文翻译的回复.后台是用Node.js写的,托管在OpenShift的Paas平台上.翻译过程实际上是调用微软的Bing translation API做的,代码中用到了alexu84的bing-translate和JacksonTian的wechat这两个npm模块.下面把做的过程详细说一下. 1. 微信公众号开发 首先是要到https://mp.weixin.qq.com 申请一个公众号,并申请成为开发者.目前个人只

利用nat123解决微信公众号对接服务器必须为80端口的问题

背景:最近公司接到做一个微信公众号的项目,需要我们提前做一个demo,好做项目的整体评估:我们公司本身有个云服务器,但没有备案,所以80端口还被电信屏蔽着,就想到利用nat123做80端口的映射:(外网80端口访问服务器上非80端口的应用) 前提:存在对接微信服务器的服务,云服务器本地访问地址为:http://localhost:8080/wxtest/WechatServlet 目标:外网通过80端口访问上述地址: 一:下载nat123 1:地址:http://www.nat123.com/P