网页爬虫抓取百度图片(外链图片转存失败,源站可能有防盗链机制(组图))

优采云 发布时间: 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 库的基本元素

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线