正则表达式data = re.findall(‘g_page_config = (.*?)g_srp_loadCss’, html,re.S)[0] 报错out of range
去掉[0]后输出,只输出了一个空列表,发现其实并没有抓取到网页信息,空列表里取首元素就出现了out of range的错误。
输出html后发现代码和网页源代码不相同,没有应有的商品信息。
思考得出大概有两种可能
-
淘宝页面异步加载,必须鼠标滑动到这一点才能加载信息,所以得不到商品的信息。
-
爬取到的html要求登陆,很可能是淘宝的反爬虫机制
所用代码(python3)
import urllib.request
import re
import json
#要爬取的网页
url = 'https://s.taobao.com/search?q=python'
#伪装成浏览器
headers = ('user-agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
#爬出网页源文件
file = urllib.request.urlopen(url)
file.encoding = 'utf-8'
html = str(file.read())
#查看爬到的html
#print(html)
data = re.compile('g_page_config = (.*?)g_srp_loadCss', re.S).findall(html)
print(data)
输出爬到的网页信息
>>>import requests
>>>r=requests.get("https://s.taobao.com/search?q=python")
>>>r.text[:10000]
#部分输出
<i class="iconfont"></i>
"登录页面"改进建议\r\n </a>\r\n</div>\r\n\t\t\t\r\n\t\t</div>\r\n\t\t<div id="content">\r\n\t\t \r\n\r\n\r\n\r\n\r\n\r\n
<div class="login-newbg" style="background-image: url(https://gtms01.alicdn.com/tps/i1/TB1GTCYLXXXXXcHXpXXcoeQ2VXX-2500-600.jpg);">\r\n\t<input type="hidden" id="J_adUrl" name="adUrl" value="">\r\n\t<input type="hidden" id="J_adImage" name="adImage" value="">\r\n\t<input type="hidden" id="J_adText" name="adText" value="">\r\n\t<input type="hidden" id="J_viewFd4PC" </i>扫码登录更安全\r\n </div>\r\n </div>\r\n </div>\r\n\t\r\n\t</div>\r\n
<div class="bd">\r\n\t\t<!--登录的错误信息结束-->\r\n\t\t\r\n\t\t
<div id="J_QuickLogin" class="ww-login hidden">\r\n\t\t\t<form action="" class="ww-form">\r\n\t\t\t\t<div class="login-title">\r\n\t\t\t\t\t选择其中一个已登录的账户\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t
<div class="ww-userlist">\r\n\r\n\t\t\t\t</div>\r\n\t\t\t\t
<div class="trigger">\r\n\r\n\t\t\t\t</div>\r\n\t\t\t\t
<div class="submit">\r\n\t\t\t\t\t<button type="submit" class="J_Submit" id="J_SubmitQuick">登 录</button>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="other-login">\r\n\t\t\t\t\t<a href="" class="light-link" id="J_Sso2Static">使用其他账户登录</a>\r\n\t\t\t\t</div>\r\n\t\t\t</form>\r\n </div>\r\n
<div id="J_MiserLogin" class="ww-login hidden">\r\n <form action="" class="ww-form">\r\n <input type="hidden" id="x_token" value="">\r\n
<div class="login-title">\r\n 选择其中一个已登录的账户\r\n </div>\r\n\r\n
查看了淘宝的robots.txt文件 https://www.taobao.com/robots.txt
(关于robots.txt文件的具体事项可以百度)
其内容如下:
User-agent: Baiduspider
Allow: /article
Allow: /oshtml
Allow: /ershou
Disallow: /product/
Disallow: /
User-Agent: Googlebot
Allow: /article
Allow: /oshtml
Allow: /product
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Disallow: /
User-agent: Bingbot
Allow: /article
Allow: /oshtml
Allow: /product
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Disallow: /
User-Agent: 360Spider
Allow: /article
Allow: /oshtml
Allow: /ershou
Disallow: /
User-Agent: Yisouspider
Allow: /article
Allow: /oshtml
Allow: /ershou
Disallow: /
User-Agent: Sogouspider
Allow: /article
Allow: /oshtml
Allow: /product
Allow: /ershou
Disallow: /
User-Agent: Yahoo! Slurp
Allow: /product
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Disallow: /
User-Agent: *
Disallow: /
通过最后一行我们可以看出它禁止了其他所有爬虫的访问,over
那么应该如何避免爬取到禁止爬取的网页?
这时候就要用到python自带的robotparser模块
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://s.taobao.com/robots.txt')
rp.read()
url = 'https://s.taobao.com'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
rp.can_fetch(user_agent,url)
这里输出的结果为False,表示不能爬取。