最近在看崇天老师的MOOC Python网络爬虫与信息提取课程,先开个头
首先必须安装requests 库
方法很简单 pip install requests即可
以上是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类
Response对象属性(重要)
Requests库的异常
params的用法
一、爬取京东实例
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,然后进入network界面,刷新之后找到对应的页面,如图
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来判断文件时候存在
上结果
图片也得到了保存
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')
然后程序一直报error,于是我拿掉了try except模块,看看问题出在哪
果然问题出在来源审查
这行报错说明了ip138网站应该是有来源审查,于是改掉headers中的agent再试试
修改user-agent参数之后,随便找了个美国的IP地址,成功了先上图
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.requests库获取网页源代码import requests
r=requests.get("https://python123.io/ws/demo.html")
print(r.text)
3. bs库的使用
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库的基本元素
bs库这里我有点懵,主要是对HTML之前了解不太多
三大信息组织形式:YAML,XML,JSON
之前搭建博客,用的就是这个YAML,踩了很多坑,yaml语言有严格的缩进要求,没写对就会报错
5.实例: 中国大学排名抓取
在demo中实现信息提取
find_all(str) 函数
正则表达式库 re :import re
re.complie('b'): 表示以B开头的所有元素
find_all 方法的用法
封装成三个函数,结构清晰
上代码和结果from bs4 import BeautifulSoup
import bs4
import requests
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
def fillUniList(ulist,html):
soup=BeautifulSoup(html,'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string,tds[1].string,tds[2].string,tds[3]])
def printUniList(ulist,num):
print("{:^10}\t{:^6}\t{:^10}\t".format('排名','学校名称','省份','总分'))
for i in range(num):
u=ulist[i]
print("{:^10}\t{:^6}\t{:^10}\t".format(u[0],u[1],u[2]))
def main():
uinfo=[]
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
html=getHTMLText(url)
fillUniList(uinfo,html)
printUniList(uinfo,20)
main()
发现没对齐
利用format函数将输出对齐
第三周
正则表达式
1.语法
search
match
findall
split
finditer
sub
complie