tip

  • 要是觉得找elements中对应部分有点麻烦,可以用ctrl+shift+c然后点网页你想要的部分,开发者模式中就会跳转过去了。

1.防盗链

  • 现在很多网站启用了防盗链反爬,防止服务器上的资源被人恶意盗取。什么是防盗链呢?

    • 从HTTP协议说起,在HTTP协议中,有一个表头字段:referer,采用URL的格式来表示从哪一个链接跳转到当前网页的。通俗理解就是:客户端的请求具体从哪里来,服务器可以通过referer进行溯源。一旦检测来源不是网页所规定的,立即进行阻止或者返回指定的页面。

2. 三里屯抓拍图爬取

网址:http://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1
可以尝试按先前的方式先去爬取试试,你会发现无法爬取想要的照片,当你用开发者模式去看的时候,你会发现她有两个url,你尝试两个src会发现两个都得不到正确的图片,这就是防盗链的作用,所以我们需要再header中加入referer
image.png
那么如何去找到referer呢?你需要在network中找到要爬取的图片,可以通过预览迅速辨认是否自己要找的图片,具体可按下图:
image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests  
from lxml import etree
url = 'http://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1'
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
'referer':'https://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1'
# "Referer": "http://blog.sina.com.cn/"
}
response = requests.get(url=url,headers=header)
response.encoding='utf-8'
page_img= response.text
tree = etree.HTML(page_img)
img_list = tree.xpath('//*[@id="sina_keyword_ad_area2"]/div/a/img/@real_src')
for img in img_list:
data = requests.get(url=img,headers=header).content
with open('name.jpg','wb') as f:
f.write(data)
break

3. cookie

  • 什么是cookie?
    • cookie的本质就是一组数据(键值对的形式存在)
    • 是由服务器创建,返回给客户端,最终会保存在客户端浏览器中。
    • 如果客户端保存了cookie,则下次再次访问该服务器,就会携带cookie进行网络访问。
      • 典型的案例:网站的免密登录

tip

在通过的之前学习后,相信对于爬虫代码的基础部分已经有所掌握,对于这些开源的数据在有爬虫技术前真要获取也是可以的,比如说你一个个人工去搜集得到,但这种机械化又大量的工作正是促使爬虫技术的诞生,更进一步,一些爬虫的技术代码是否也是如此呢?据此,我想要介绍一个工具‘curlconverter’
网址:https://curlconverter.com/
image.png
通过上述步骤再复制的网站中,就可得到如下一些基础的代码,也可以提高一定的效率。
image.png

案例:雪球网数据

#ps:用谷歌和edge可能会无法用开发者模式获取数据,可能是一种反爬机制,但博主用联想浏览器可以打开,并且代码可以成功运行。
网址:https://xueqiu.com/
image.png
如上图一样找到curl,然后到之前的给出的网站获得对应的代码再进行修改即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import time  

import requests
import json
pages = input('请你输入想要爬取几页:')
cookies = {
'xq_a_token': '9773bacc11404cb5ac8b0847c564eda3730e6b61',
'xqat': '9773bacc11404cb5ac8b0847c564eda3730e6b61',
'xq_r_token': 'caf75c71460c20a680e6e3c455cadcca5c1be14a',
'xq_id_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTc0NzM1NzE4MywiY3RtIjoxNzQ1MDQ4NDMxOTI5LCJjaWQiOiJkOWQwbjRBWnVwIn0.S6DfPNTKxGAQwLt9gFPf2A16vqu5_UCPLrr5qgtlUuGnbtmGSsahB6kSe_bfpCbwvNmGgoDQ6Ot2vVDQtXwJfqWXNS8pKzskKHhed8L48G4uV0g1iX4dmrWqHFfZwwCVn3YKEH2H7dP20eU_U1FTXC8ikqHtjXPxu661rmTMGVdKG3xD5uM8DDcwZUBC6ZpetUUtzTe5To_8prNyBFujdfuUsd8zsaS-1gRCgqyiRWgQxAq204mmgo7uJ7TDWjwfYnSvg0m_JMYW8Wj7MV5ajR2dRM3XBEcNFtOWYNQi0xWhY13vt-NDZLKBWNE4mkirNtjG5cdjTO03ATJ6eYDYhg',
'cookiesu': '401745048477218',
'u': '401745048477218',
'device_id': 'e67adc9306236a61a4c97845cd9ebec4',
'Hm_lvt_1db88642e346389874251b5a1eded6e3': '1745048506',
'HMACCOUNT': 'A39F3B65D44D61BF',
'Hm_lpvt_1db88642e346389874251b5a1eded6e3': '1745048777',
'ssxmod_itna': 'QqUOGKAK0KD5YKGQGCDhZILq7QGO1D7IDkDl4BtGRDeq7tDRDFqApYDHKjwzdsYWD1Axx4tFmAeR5DBMxbDSxD6ODK4GTpIoeWXPeDpBxIIrYQgrXorDcmeM5qwjer+pjsL/6MzpDCPGnD06x+ALbDYYLDBYD74G+DDeDi23Dj4GmDGAdNeDFGnb=gebPTxDwDB=DmkwWYPDfDDdYsBYiGlcVIeeD0qmsxo4Q+DGWGQuVW=p=DGUxRWQYx0UFDBLef/FDGu8jxguQsFQ+HbrWrPGuDG=HXQ0=jORiyli+do+qF4VbB34TK7tO7e=G4q7x1gDcfx+YqpYh80QTGGID=CE+pDDi2X=RpqiAb7Un2tYgtBa4TnG9mbg0eUeKilP7/Dd9wsmGGQe+WKHthQCD4eheWA/=xxD',
'ssxmod_itna2': 'QqUOGKAK0KD5YKGQGCDhZILq7QGO1D7IDkDl4BtGRDeq7tDRDFqApYDHKjwzdsYWD1Axx4tFmAebDia4WEINhSngwzVbeCY2YeI3afD',
}

headers = {
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9',
'origin': 'https://xueqiu.com',
'priority': 'u=1, i',
'referer': 'https://xueqiu.com/',
'sec-ch-ua': '"Chromium";v="9", "Not?A_Brand";v="8"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.2081 SLBChan/103 SLBVPV/64-bit',
}
l = []
for page in pages:
params = {
'page': page,
'size': '10',
'type': 'sha',
'order_by': 'percent',
'order': 'desc',
}

response = requests.get(
'https://stock.xueqiu.com/v5/stock/screener/quote/list.json',
params=params,
cookies=cookies,
headers=headers,
)
d = response.json().get('data').get('list')
# print(d)

l.extend(d)
# print(l)
#确保不要访问频率过快
time.sleep(1)

with open('list.json','w') as fp:
fp.write(json.dumps(l, indent=2, ensure_ascii=False))

但是虽然目前的cookie都能直接用,但实际上在主流的网站,对于cookie可能是有防备的,比如cookie可能会有有效期,或者说cookie就是一次性的,当这种情况下,对于,这样获取的cookie可能就无法成功用于代码中
正如先前所言,所有爬虫代码的不成功都是拟人度不够,比如说现在的代码都是根据请求头和网址直接进去数据所在的页面,但是正常流程应该是打开网站的首页,再点击之后的,所以通过代码先对主页面进行访问,浏览器会给代码一个全新的cookie,代码通过这个cookie就可以更稳定运行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import requests  
# 第一次请求
import requests

headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
}
url = 'https://xueqiu.com/hq'
response = requests.get(url, headers=headers)
# print(response.status_code)
# print(response.headers)
# print(response.content)
# print(response.text)
print(response.cookies.get_dict())
c1 = response.cookies.get_dict()

# 第二次请求,携带动态cookie
headers = {
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',

'origin': 'https://xueqiu.com',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://xueqiu.com/',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}

params = {
'page': '1',
'size': '10',
'type': 'sha',
'order_by': 'percent',
'order': 'desc',
'md5__1632': '7q+xuQKDqmwOD/Wi4BKw1QDcWODO7fAeD',
}

response = requests.get(
'https://stock.xueqiu.com/v5/stock/screener/quote/list.json',
params=params,
cookies=c1,
headers=headers,
)

print(response.text)

基于session对象实现自动处理cookie。

  • 1.创建一个空白的session对象。
  • 2.需要使用session对象发起请求,请求的目的是为了捕获cookie
    - 注意:如果session对象在发请求的过程中,服务器端产生了cookie,则cookie会自动存储在session对象中。
  • 3.使用携带cookie的session对象,对目的网址发起请求,就可以实现携带cookie的请求发送,从而获取想要的数据。

注意:session对象至少需要发起两次请求

  • 第一次请求的目的是为了捕获存储cookie到session对象
  • 后次的请求,就是携带cookie发起的请求了
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import requests  
    # 第一次请求
    import requests
    session = requests.session()

    headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    }
    url = 'https://xueqiu.com/hq'
    # session:自动管理session
    session.get(url, headers=headers)



    # 第二次请求,携带动态cookie
    headers = {
    'accept': 'application/json, text/plain, */*',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cache-control': 'no-cache',
    #'cookie': 'u=851695628862640; HMACCOUNT=2A4FB6ADBAE70C94; cookiesu=591728562312333; device_id=ce2bbbc0e3a672b689052fc9204f8b61; xq_a_token=7716f523735d1e47a3dd5ec748923068ab8198a8; xqat=7716f523735d1e47a3dd5ec748923068ab8198a8; xq_r_token=0483ea3986e45954e03c9294444a1af14d7579d3; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTczMzEwMDgxNywiY3RtIjoxNzMxNzY2NTA1ODkyLCJjaWQiOiJkOWQwbjRBWnVwIn0.GqQPJ3wNkRxoWlb8W32s66nnlZCr9_8QhlChq5S2hdVOPBA4JcZFM2d9XaxkULzYt9KxFnDKa4dx_t4BDWfK-Bm9pV5YiheFBwvePRwnFldsSgVuw-SJBHTthJCo3wOzFkxubRyFtC248rKmuNPSaD1x7QtTHFk77O-5917lxJlip61oEZ-o1c51N31vGcQfxjzK2Do1xwPaU-3MZK_-jL3wuMZEcbRCbBTpD1GQj7PrATbajsO4Z1x7Xf58CmrLHeBz6DXIhNDf28MkxoEjSzT-mSNsCEIMXp0dbSQqhEp0D1hX3LqcCKLHebCRTiR0dMPMMIR1E_0a4-swY9Goag; Hm_lvt_1db88642e346389874251b5a1eded6e3=1731766508; is_overseas=0; ssxmod_itna=iqGxyDBiitG=KAIK0dGQDHYySeewx7IXIKAmYedND/SGIDnqD=GFDK40EoSxPd+3iYDxR3hGl7A4+F1/n8GwFoFx+OpxXSQxiTD4q07Db4GkDAqiOD7uqhoD445GwD0eG+DD4DWzqDU/fhKDjGHCcp5HAOIHfh5DbhKODiK8DYvpDAThVPYzCcxzDDapDlKhDWPODQHsAxKDExGOX+ImBxGaFfSLmbKDEj+Cmb3DvcOOG12z/xY8/txYeWpkU6nePchYYjixGn0Dzn293EDyF704dDrP3r0FkrZeee3lzYD=; ssxmod_itna2=iqGxyDBiitG=KAIK0dGQDHYySeewx7IXIKAmYedG9WMtDBL80D7prMqaG2YzxFqG7eeD; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1731766579',
    'origin': 'https://xueqiu.com',
    'pragma': 'no-cache',
    'priority': 'u=1, i',
    'referer': 'https://xueqiu.com/',
    'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-site',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    }

    params = {
    'page': '1',
    'size': '10',
    'type': 'sha',
    'order_by': 'percent',
    'order': 'desc',
    'md5__1632': '7q+xuQKDqmwOD/Wi4BKw1QDcWODO7fAeD',
    }

    response = session.get(
    'https://stock.xueqiu.com/v5/stock/screener/quote/list.json',
    params=params,
    headers=headers,
    )

    print(response.text)