欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

程序员文章站 2022-05-04 12:23:20
用户代理池 用户代理池就是将不同的用户代理组建成为一个池子,随后随机调用。 作用:每次访问代表使用的浏览器不一样 IP代理与IP代理池的构建的两种方案 搜索西刺、大象代理IP 尽量选国外的IP。 IP代理池构建的第一种方式(适合代理IP稳定的情况) IP代理池构建的第二种方式(接口调用法,更适合代理 ......

用户代理池

用户代理池就是将不同的用户代理组建成为一个池子,随后随机调用。

作用:每次访问代表使用的浏览器不一样

import urllib.request
import re
import random
uapools=[
    'mozilla/5.0 (windows nt 10.0; win64; x64; rv:68.0) gecko/20100101 firefox/68.0',
    'mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.98 safari/537.36 lbbrowser',
    'mozilla/5.0 (windows nt 6.1; wow64) applewebkit/535.1 (khtml, like gecko) chrome/14.0.835.163 safari/535.1',
    'mozilla/5.0 (windows; u; windows nt 6.1; ) applewebkit/534.12 (khtml, like gecko) maxthon/3.0 safari/534.12',
]
def ua(uapools):
    thisua=random.choice(uapools)
    print(thisua)
    headers=("user-agent",thisua)
    opener=urllib.request.build_opener()
    opener.addheaders=[headers]
    urllib.request.install_opener(opener)

for i in range(10):
    ua(uapools)
    thisurl="https://www.qiushibaike.com/text/page/"+str(i+1)+"/";
    data=urllib.request.urlopen(thisurl).read().decode("utf-8","ignore")
    pat='<div class="content">.*?<span>(.*?)</span>.*?</div>'
    res=re.compile(pat,re.s).findall(data)
    for j in range(len(res)):
        print(res[j])
        print('---------------------')

ip代理与ip代理池的构建的两种方案

搜索西刺、大象代理ip

尽量选国外的ip。

import  urllib.request
ip="219.131.240.35"
proxy=urllib.request.proxyhandler({"http":ip})
opener=urllib.request.build_opener(proxy,urllib.request.httphandler)
urllib.request.install_opener(opener)
url="https://www.baidu.com/"
data=urllib.request.urlopen(url).read()
fp=open("ip_baidu.html","wb")
fp.write(data)
fp.close()

ip代理池构建的第一种方式(适合代理ip稳定的情况)

import random
import urllib.request
ippools=[
    "163.125.70.22",
    "111.231.90.122",
    "121.69.37.6",
]

def ip(ippools):
    thisip=random.choice(ippools)
    print(thisip)
    proxy=urllib.request.proxyhandler({"http":thisip})
    opener=urllib.request.build_opener(proxy,urllib.request.httphandler)
    urllib.request.install_opener(opener)

for i in range(5):
    try:
        ip(ippools)
        url="https://www.baidu.com/"
        data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
        print(len(data))
        fp=open("ip_res/ip_baidu_"+str(i+1)+".html","w")
        fp.write(data)
        fp.close()
    except exception as err:
        print(err)

ip代理池构建的第二种方式(接口调用法,更适合代理ip不稳定的情况)

此方法因为经济原因暂时鸽着。

淘宝商品图片爬虫

现在的淘宝反爬虫,下面这份代码已经爬不了了,但可以作为练习。

import urllib.request
import re
import random
keyname="python"
key=urllib.request.quote(keyname) #网址不能有中文,这里处理中文
uapools=[
    'mozilla/5.0 (windows nt 10.0; win64; x64; rv:68.0) gecko/20100101 firefox/68.0',
    'mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.98 safari/537.36 lbbrowser',
    'mozilla/5.0 (windows nt 6.1; wow64) applewebkit/535.1 (khtml, like gecko) chrome/14.0.835.163 safari/535.1',
    'mozilla/5.0 (windows; u; windows nt 6.1; ) applewebkit/534.12 (khtml, like gecko) maxthon/3.0 safari/534.12',
]
def ua(uapools):
    thisua=random.choice(uapools)
    print(thisua)
    headers=("user-agent",thisua)
    opener=urllib.request.build_opener()
    opener.addheaders=[headers]
    urllib.request.install_opener(opener)

for i in range(1,11): #第1页到第10页
    ua(uapools)
    url="https://s.taobao.com/search?q="+key+"&s="+str((i-1)*44)
    data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
    pat='pic_url":"//(.*?)"'
    imglist=re.compile(pat).findall(data)
    print(len(imglist))
    for j in range(len(imglist)):
        thisimg=imglist[j]
        thisimgurl="https://"+thisimg
        localfile="淘宝图片/"+str(i)+str(j)+".jpg"
        urllib.request.urlretrieve(thisimgurl,localfile)

同时使用用户代理池和ip代理池

封装成函数:

import urllib.request
import re
import random
uapools=[
    'mozilla/5.0 (windows nt 10.0; win64; x64; rv:68.0) gecko/20100101 firefox/68.0',
    'mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.98 safari/537.36 lbbrowser',
    'mozilla/5.0 (windows nt 6.1; wow64) applewebkit/535.1 (khtml, like gecko) chrome/14.0.835.163 safari/535.1',
    'mozilla/5.0 (windows; u; windows nt 6.1; ) applewebkit/534.12 (khtml, like gecko) maxthon/3.0 safari/534.12',
]
ippools=[
    "163.125.70.22",
    "111.231.90.122",
    "121.69.37.6",
]
def ua_ip(myurl):
    def ip(ippools,uapools):
        thisip=random.choice(ippools)
        print(thisip)
        thisua = random.choice(uapools)
        print(thisua)
        headers = ("user-agent", thisua)
        proxy=urllib.request.proxyhandler({"http":thisip})
        opener=urllib.request.build_opener(proxy,urllib.request.httphandler)
        opener.addheaders = [headers]
        urllib.request.install_opener(opener)

    for i in range(5):
        try:
            ip(ippools,uapools)
            url=myurl
            data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
            print(len(data))
            break
        except exception as err:
            print(err)
    return data
data=ua_ip("https://www.baidu.com/")
fp=open("uaip.html","w",encoding="utf-8")
fp.write(data)
fp.close()

封装成模块:

把模块拷贝到python目录

python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

使用:

from uaip import *
data=ua_ip("https://www.baidu.com/")
fp=open("baidu.html","w",encoding="utf-8")
fp.write(data)
fp.close()

抓包分析

fiddler工具:用作代理服务器,request和response都要经过fiddler

选用火狐浏览器,设置网络:python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

设置https协议:打开fiddler的工具的选项,打上勾

python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

然后点actions选导入到桌面。

再回到火狐的设置

python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

导入桌面上的证书

常用命令clear:清屏

自动进行ajax异步请求数据

如微博,拖到下面的时候数据才加载出来,不是同步出来的。再如“点击加载更多”,都是异步,需要抓包分析。

看下面这个栗子。

腾讯视频评论(深度解读)爬虫实战

在火狐浏览器打开腾讯视频,比如https://v.qq.com/x/cover/j6cgzhtkuonf6te.html

点击查看更多解读,这时fiddler会有一个js文件:

python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

里面的内容就是评论。

找到一条评论转一下码:python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

在火狐里ctrl+f看看有没有这条评论。

copy js文件的url。

点击查看更多评论,再触发一个json,copy url

分析两个url:python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

简化一下网页试试:

通过分析,我们可以知道j6cg……是视频id,reqnum是每次查看的评论数量,commentid是评论id

】?reqnum=【num】&commentid=【cid】

  1. 单页评论爬虫
    有一些特殊字符比如图片现在还不知道怎么处理……以后再说吧
import urllib.request
import re
from uaip import *
vid="j6cgzhtkuonf6te"
cid="6227734628246412645"
num="3" #每页提取3个
url="https://video.coral.qq.com/filmreviewr/c/upcomment/"+vid+"?reqnum="+num+"&commentid="+cid
data=ua_ip(url)
titlepat='"title":"(.*?)","abstract":"'
commentpat='"content":"(.*?)",'
titleall=re.compile(titlepat,re.s).findall(data)
commentall=re.compile(commentpat,re.s).findall(data)
# print(len(commentall))
for i in range(len(titleall)):
    try:
        print("评论标题是:"+eval("u'"+titleall[i]+"'"))
        print("评论内容是:"+eval("u'"+commentall[i]+"'"))
        print('---------------')
    except exception as err:
        print(err)
  1. 翻页评论爬虫
    查看网页源代码可以发现last:后面的内容为下一页的id

    import urllib.request
    import re
    from uaip import *
    vid="j6cgzhtkuonf6te"
    cid="6227734628246412645"
    num="3"
    for j in range(10): #爬取1~10页内容
        print("第"+str(j+1)+"页")
        url = "https://video.coral.qq.com/filmreviewr/c/upcomment/" + vid + "?reqnum=" + num + "&commentid=" + cid
        data = ua_ip(url)
        titlepat = '"title":"(.*?)","abstract":"'
        commentpat = '"content":"(.*?)",'
        titleall = re.compile(titlepat, re.s).findall(data)
        commentall = re.compile(commentpat, re.s).findall(data)
        lastpat='"last":"(.*?)"'
        cid=re.compile(lastpat,re.s).findall(data)[0]
        for i in range(len(titleall)):
            try:
                print("评论标题是:" + eval("u'" + titleall[i] + "'"))
                print("评论内容是:" + eval("u'" + commentall[i] + "'"))
                print('---------------')
            except exception as err:
                print(err)

对于短评(普通评论)方法类似,这里就不赘述了,看下面这个短评爬虫代码:

简化成:

import urllib.request
import re
from uaip import *
vid="1743283224"
cid="6442954225602101929"
num="5"
for j in range(10): #爬取1~10页内容
    print("第"+str(j+1)+"页")
    url="https://video.coral.qq.com/varticle/"+vid+"/comment/v2?orinum="+num+"&oriorder=o&pageflag=1&cursor="+cid
    data = ua_ip(url)
    commentpat = '"content":"(.*?)"'
    commentall = re.compile(commentpat, re.s).findall(data)
    lastpat='"last":"(.*?)"'
    cid=re.compile(lastpat,re.s).findall(data)[0]
    # print(len(gg))
    # print(len(commentall))
    for i in range(len(commentall)):
        try:
            print("评论内容是:" + eval("u'" + commentall[i] + "'"))
            print('---------------')
        except exception as err:
            print(err)