如何使用python解决网站的反爬虫

如何使用python解决网站的反爬虫,第1张

1、从用户请求的Headers反爬虫是最常见的反爬虫策略。

伪装header。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名[评论:往往容易被忽略,通过对请求的抓包分析,确定referer,在程序中模拟访问请求头中添加]。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

2、基于用户行为反爬虫

还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同 *** 作。[这种防爬,需要有足够多的ip来应对]

(1)、大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的**,检测后全部保存起来。有了大量**后可以每请求几次更换一个ip,这在requests或者urllib中很容易做到,这样就能很容易的绕过第一种反爬虫。

编写爬虫代理:

步骤:

1参数是一个字典{'类型':'**:端口号'}

proxy_support=urllibrequestProxyHandler({})

2定制、创建一个opener

opener=urllibrequestbuild_opener(proxy_support)

3a安装opener

urllibrequestinstall_opener(opener)

3b调用opener

openeropen(url)

用大量代理随机请求目标网站,应对反爬虫

前端是拿不到iframe的header的。走后端代理。前提你需要熟悉>

1请求行 最开始GET 开头的一串,GET表示请求方式,后面跟的是请求参数、>

1、通过UA判断:UA是UserAgent,是要求浏览器的身份标志。

UA是UserAgent,是要求浏览器的身份标志。反爬虫机制通过判断访问要求的头部没有UA来识别爬虫,这种判断方法水平很低,通常不作为唯一的判断标准。反爬虫非常简单,可以随机数UA。

2、通过Cookie判定:Cookie是指会员帐户密码登录验证

Cookie是指会员帐户密码登录验证,通过区分该帐户在短时间内爬行的频率来判断。这种方法的反爬虫也很困难,需要多账户爬行。

3、通过访问频率判定

爬虫类经常在短时间内多次访问目标网站,反爬虫类机制可以通过单个IP访问的频率来判断是否是爬虫类。这样的反爬方式难以反制,只能通过更换IP来解决。

4、通过验证码判定

验证码是反爬虫性价比高的实施方案。反爬虫通常需要访问OCR验证码识别平台,或者使用TesseractOCR识别,或者使用神经网络训练识别验证码。

5、动态性页面加载

使用动态加载的网站通常是为了方便用户点击和查看,爬虫无法与页面互动,这大大增加了爬虫的难度。

一般情况下,用户对网站进行信息爬取时,都要受到“爬虫”的约束,使用户在获取信息时受到一定的阻碍

本编博客是关于爬取天猫店铺中指定店铺的所有商品基础信息的爬虫,爬虫运行只需要输入相应店铺的域名名称即可,信息将以csv表格的形式保存,可以单店爬取也可以增加一个循环进行同时爬取。

源码展示

首先还是完整代码展示,后面会分解每个函数的意义。

# -- coding: utf-8 --

import requests

import json

import csv

import random

import re

from datetime import datetime

import time

class TM_producs(object):

def __init__(self,storename):

selfstorename = storename

selfurl = ''format(storename)

selfheaders = {

"user-agent":"Mozilla/50 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601146 "

"(KHTML, like Gecko) Version/90 Mobile/13B143 Safari/6011"

}

datenum = datetimenow()strftime('%Y%m%d%H%M')

selffilename = '{}_{}csv'format(selfstorename, datenum)

selfget_file()

def get_file(self):

'''创建一个含有标题的表格'''

title = ['item_id','price','quantity','sold','title','totalSoldQuantity','url','img']

with open(selffilename,'w',newline='') as f:

writer = csvDictWriter(f,fieldnames=title)

writerwriteheader()

return

def get_totalpage(self):

'''提取总页码数'''

num = randomrandint(83739921,87739530)

endurl = '/shop/shop_auction_searchdosort=s&p=1&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'

url = selfurl + endurlformat(num)

html = requestsget(url,headers=selfheaders)text

infos = refindall('\(({})\)',html)[0]

infos = jsonloads(infos)

totalpage = infosget('total_page')

return int(totalpage)

def get_products(self,page):

'''提取单页商品列表'''

num = randomrandint(83739921, 87739530)

endurl = '/shop/shop_auction_searchdosort=s&p={}&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'

url = selfurl + endurlformat(page,num)

html = requestsget(url, headers=selfheaders)text

infos = refindall('\(({})\)', html)[0]

infos = jsonloads(infos)

products = infosget('items')

title = ['item_id', 'price', 'quantity', 'sold', 'title', 'totalSoldQuantity', 'url', 'img']

with open(selffilename, 'a', newline='') as f:

writer = csvDictWriter(f, fieldnames=title)

writerwriterows(products)

def main(self):

'''循环爬取所有页面宝贝'''

total_page = selfget_totalpage()

for i in range(1,total_page+1):

selfget_products(i)

print('总计{}页商品,已经提取第{}页'format(total_page,i))

timesleep(1+randomrandom())

if __name__ == '__main__':

storename = 'uniqlo'

tm = TM_producs(storename)

tmmain()

上面代码是选择了优衣库作为测试店铺,直接输入优衣库店铺的域名中关键词即可,最终表格会按照店铺名称和时间名词。

代码解读

导入库说明

requests 库不用多数,爬取网页的主要库

json 库是用来解析 json 格式的数据的,也就是 Python 中的字典格式

csv 库是用来创建 csv 表格和保存信息的

random 库是用来生成一个随机数的,这个代码中用到了两次,第一次是生成一个随机数据去获取最新的网页信息而不是缓存信息,第二次是随机一个时间,来减缓爬虫速度

re 库是正则,主要用来提取信息

datetime 和 time 都是时间库,前者一般用来生成当前时间字符串,后者本爬虫使用设置延迟时间

爬虫思路

首先通过分析手机端天猫店铺所有商品的网页,可以发现每次下滑一页都有一个 js 被加载,这个 js 的规律可以总结一下;

通过分析可以发现每次请求 js 都可以得到一个关键信息,那就是 total_page 这个参数,这也一想就能猜到,就是当前店铺的总页码数,所以可以先取得这个数字,然后使用循环爬取全店商品;

每一页有24个商品,而请求得到的是一个类似于 json 格式的网页信息,但是并非是直接的 json,所以可以用正则表达式提取符合 json 格式的部分留用;

将每一页的信息保存到 csv 表格中,可以直接使用 csv 库的字典存储方式,非常方便;

得到了单页的信息,也得到了总页码数,只需要一个循环就可以爬取全店的商品了。

构造爬虫类

def __init__(self,storename):

   selfstorename = storename

   selfurl = 'format(storename)

   selfheaders = {

       "user-agent":"Mozilla/50 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601146 "

                    "(KHTML, like Gecko) Version/90 Mobile/13B143 Safari/6011"

   }

   datenum = datetimenow()strftime('%Y%m%d%H%M')

   selffilename = '{}_{}csv'format(selfstorename, datenum)

   selfget_file()

上面代码依次完成以下 *** 作:

首先整个爬虫是写成了一个类,在初始化类的时候需要传递一个参数,这个参数就是店铺的名称。

然后构造出店铺的所有商品页面的前半部分,这部分都是不会变的

接着设置一个请求头

按照当前时间生成一个以时间为依据的字符串,用来给文件命名,然后赋值给文件名称,确定保存文件的名称

最后一句是在类生成的时候就运行这个函数,及生成一个带有标题的表格,后面会说道这个函数的具体含义

关于知乎验证码登陆的问题,用到了Python上一个重要的处理库PIL,如果不行,就把存到本地,手动输入。

通过对知乎登陆是的抓包,可以发现登陆知乎,需要post三个参数,一个是账号,一个是密码,一个是xrsf。

这个xrsf隐藏在表单里面,每次登陆的时候,应该是服务器随机产生一个字符串。所有,要模拟登陆的时候,必须要拿到xrsf。

用chrome (或者火狐 >

以上就是关于如何使用python解决网站的反爬虫全部的内容,包括:如何使用python解决网站的反爬虫、javaweb如何获取ifream页面实时headers (jsounp)、Python爬虫如何获取网页Network中某个文件的response等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9602217.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存