上一篇提到过: requests库适合"只拿一次"(拿一些html, 很多时候也拿到dict数据, 或者图片数据...等等)...如果对页面解析理解很深刻, 其实单用requests就能搞定大部分工作了, 这东西就像一把小匕首, 如果你知道牛的骨架, 自然用的很溜, 可是如果你对牛的骨架不了解. 那就用后面提到的webdriver大斧子直接砍吧.
爬个网站试试
比如下面这个, 提供一堆代理ip的网站, 这种页面很简单, 也没啥技术含量. 很容易爬
步骤1: 谷歌浏览器. F12弹出开发者模式 (其他浏览器也有,可能快捷键不一样)
步骤2: 知道页面是怎么做的之后, 开始写代码 [请留意里面的注释]
import requests
from bs4 import BeautifulSoup
#headers是请求的一些附带信息, 可以自行百度了解下, 不带的话可能会报503或其他错误
headers = {
'Connection':'keep-alive',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'
}
response = requests.get("http://www.xicidaili.com/",headers=headers) #访问地址, 拿到结果
print(response.text)
soup = BeautifulSoup(response.text) #把内容转成soup对象, 就可以用soup提供的方法直接开始用了
table = soup.find('table',attrs={'id':'ip_list'})
#tbody = table.find('tbody')
trs = table.findAll('tr')
for tr in trs:
tds = tr.findAll('td')
if len(tds)>2:
ip = tds[1].text
port = tds[2].text
print(str(ip)+"--"+str(port))
解释下beautifulsoap:
我们要找html里面的某个元素, 可以自己写正则表达式, 但是无疑太麻烦, python提供了如beautifulsoup这样的库, 负责解析html. 这样我们用的时候直接: soup.find("title")类似的语句就能拿到"百度"这个信息, 而不用自己写正则表达式匹配
注意上面的代码中的tbody我注掉了. ... 因为发现 table.find('tbody') 返回一个None/...我也不知道为什么浏览器里面有tbody,但是requests.get拿到的就没了,....总之不影响解析. 只要能找到元素就行了.(可以用pycharm一行行调试看变量值)
这个代码就能输出这个页面所有的ip和端口信息了.
有很多页数据怎么办?
答案是: 找规律
比如下面的:
重点注意:
不要指望用requests做到所有事情, 它是一个很简单的工具, 所以只能做简单的事情.
举一个反例:
知乎:
你可以试下: requests.get("https://www.zhihu.com/") 然后把text打印出来看看....你会发现根本找不到"喵星人能有多喜欢人类"... 因为内容不是通过"https://www.zhihu.com/"加载的, 而是异步加载的.
这个异步是怎么触发的呢?
是浏览器做的事, 浏览器先找到 www.zhihu.com, 下了一个页面, 然后页面里面有新的指示, 说: 浏览器你去下www.zhihu.com/api/image. 再去下xxxx.....等其他东西, 然后放到这个页面里面. 出来的就是各种图片,数据....
但是requests比较简单, 它第一步拿到页面, 就不管了....所以后面的数据都没出来.
现在的网站很多都是异步加载, 怎么办?
两个方法:
方法一: 借助F12, 也就是浏览器调试工具, 找到真实的url , 然后用requests访问. 但是这么做可能会需要格外的伪造一些headers信息. 不然服务器一般会通过headers信息验证你是不是正规浏览器访问.
方法二: 使用其他能模拟浏览器的访问容器(如webdriver), 就和浏览器一模一样, 能自动下载完所有关联的url. 然后你就可以直接用了. 细节见下一篇文章.
特别注意:
用requests库的话, headers得特别了解下, 因为如果headers里面哪个信息缺失了, 或者搞错了, 会遇到401, 503等各种错误...因为服务器认为你不是合法的浏览器或请求者