网页爬虫抓取百度图片(外链图片转存失败,源站可能有防盗链机制(组图))
优采云 发布时间: 2022-03-24 18:05网页爬虫抓取百度图片(外链图片转存失败,源站可能有防盗链机制(组图))
最近在看重天老师的MOOC Python网络爬虫与信息抽取课程,开始吧
必须先安装 requests 库
方法很简单 pip install requests
【外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-aW55ejx9-14)(/img/bVbMkeh)】
以上是requests库中的7个主要方法
import requests
url='http://www.baidu.com'
r=requests.get(url)
print(r.status_code)
r.encoding='utf-8'
print(r.text)
简单抓取百度的代码
r=requests.get(url)
这行代码中,返回的r的数据类型是Response类,赋值号右边是Request类
响应对象属性(重要)
[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-cwG13p6e-17)(/img/bVbMkfA)]
请求库异常
[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-yTu9bPnR-18)(/img/bVbMkgu)]
[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-sUEEt355-19)(/img/bVbMkgI)]
参数的使用
一、爬取 JD 实例
1.爬京东时网站
import requests
url='https://item.jd.com/100006713417.html'
try:
r=requests.get(url)
print(r.status_code)
print(r.text[:1000])
except :
print('出现异常')
得到这个结果:
显然这不是我们想要的信息,访问结果中的链接发现是京东的登录界面。
2.解决问题
查了相关资料,发现京东有源码审查,所以可以通过修改headers和cookie参数来实现
Cookie参数查找方法:
进入页面后按F12,然后进入网络界面,刷新找到对应页面,如图
import requests
url = 'https://item.jd.com/100006713417.html'
cookiestr='unpl=V2_ZzNtbRAHQ0ZzDk9WKBlbDWJXQF5KBBYRfQ0VBHhJWlEyABBaclRCFnQUR11nGlUUZwYZWEdcRxxFCEVkexhdBGAAE19BVXMlRQtGZHopXAFvChZVRFZLHHwJRVRyEVQDZwQRWENncxJ1AXZkMEAaDGAGEVxHVUARRQtDU34dXjVmMxBcQ1REHXAPQ11LUjIEKgMWVUtTSxN0AE9dehpcDG8LFF1FVEYURQhHVXoYXAJkABJtQQ%3d%3d; __jdv=122270672|mydisplay.ctfile.com|t_1000620323_|tuiguang|ca1b7783b1694ec29bd594ba2a7ed236|1598597100230; __jdu=15985970988021899716240; shshshfpa=7645286e-aab6-ce64-5f78-039ee4cc7f1e-1598597100; areaId=22; ipLoc-djd=22-1930-49324-0; PCSYCityID=CN_510000_510100_510116; shshshfpb=uxViv6Hw0rcSrj5Z4lZjH4g%3D%3D; __jdc=122270672; __jda=122270672.15985970988021899716240.1598597098.1598597100.1599100842.2; shshshfp=f215b3dcb63dedf2e335349645cbb45e; 3AB9D23F7A4B3C9B=4BFMWHJNBVGI6RF55ML2PWUQHGQ2KQMS4KJIAGEJOOL3ESSN35PFEIXQFE352263KVFC2JIKWUJHDRXXMXGAAANAPA; shshshsID=2f3061bf1cc51a3f6162742028f11a80_5_1599101419724; __jdb=122270672.11.15985970988021899716240|2.1599100842; wlfstk_smdl=mwti16fwg6li5o184teuay0iftfocdez'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.14 Safari/537.36 Edg/83.0.478.13","cookie":cookiestr}
try:
r = requests.get(url=url,headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print('爬取失败')
import requests
kv = {'user-agent':'Mozilla/5.0'}
url = "https://item.jd.com/100006713417.html"
try:
r = requests.get(url,headers = kv)
r.encoding = r.apparent_encoding
r.raise_for_status()
print(r.text[:1000])
except :
print('Error')
都得到我们想要的结果
二、爬取亚马逊实例
import requests
url = "https://www.amazon.cn/dp/B072C3KZ48/ref=sr_1_5?keywords=Elizabeth+Arden+%E4%BC%8A%E4%B8%BD%E8%8E%8E%E7%99%BD%E9%9B%85%E9%A1%BF&qid=1599103843&sr=8-5"
try:
r = requests.get(url)
print(r.status_code)
print(r.encoding)
print(r.request.headers)
r.encoding = r.apparent_encoding
print(r.text[:5000])
except :
print('Error')
出现了同样的问题。老师在这里解释了。亚马逊也有来源审查。当 headers 参数没有被修改时,程序告诉亚马逊服务器这是对 py requests 库的访问。
所以有一个错误。
2.解决办法
如上,修改user-agent
结果:
还是有问题,下面有提示,
这里提示可能存在cookie相关的问题,所以我们找到网页的cookie,放到headers中
问题成功解决
三、爬取图片
当我们要爬取网页上的图片时,我们应该怎么做。
现在知道网页上的图片链接是格式
url链接以jpg结尾,描述为图片
按照冲天老师的提示写了一段代码
import requests
import os
url='https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2588111137,2818876915&fm=26&gp=0.jpg'
root='d:/pics//'
path = root+url.split('/')[-1]
try:
if not os.path.exists(root):
os.makedirs(root)
if not os.path.exists(path):
r=requests.get(url)
with open(path,'wb') as f:
f.write(r.content)
f.close()
print('文件保存成功')
else:
print('文件已经存在')
except:
print('爬取出错')
这里import os判断文件是否存在
结果上
[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-xv0bBm8f-21)(/img/bVbMr7U)]
[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-7tOVoMvj-21)(/img/bVbMr7W)]
图片也保存了
IP地址归属地自动查询
实战中遇到了一个小问题
先编码
import requests
url_1 = 'https://www.ip138.com/iplookup.asp?ip=112.44.101.245&action=2'
ip_address = input('Please input your ip address')
url = url_1+ip_address+'&action=2'
if ip_address:
try:
r = requests.get(url)
print(r.status_code)
print(r.text[-500:])
except:
print('error')
else:
print('ip address cannot be empty')
然后程序一直报错,于是我把try except模块去掉,看看问题出在哪里。
果然,问题是源审查
[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-FF8AqVZd-22)(/img/bVbMr9Y)]
这行错误说明ip138网站应该有source review,所以换个headers里的agent再试一次
修改user-agent参数后,刚好找到一个美国的IP地址,上图成功。
[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-puo6nDNG-22)(/img/bVbMsaQ)]
import requests
url_1 = 'https://www.ip138.com/iplookup.asp?ip='
ip_address = input('Please input your ip address')
kv={'user-agent':'chrome/5.0'}
url = url_1+ip_address+'&action=2'
if ip_address:
try:
r = requests.get(url,headers=kv)
print(r.status_code)
r.encoding=r.apparent_encoding
print(r.text)
except:
print('error')
else:
print('ip address cannot be empty')
第二周
Beautiful Soup 库1.安装 Beautiful Soup 库
CMD pip install beautifulsoup4
2.请求库获取网页源代码
import requests
r=requests.get("https://python123.io/ws/demo.html")
print(r.text)
3. bs 库的使用
【外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-tKeVDKKg-23)(/img/bVbMsca)】
import requests
from bs4 import BeautifulSoup
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo,'html.parser')
print(soup.prettify())
4. bs 库的基本元素