1、背景:需要爬取网上的信息,Ubuntu系统下 使用Python完成
2、首先需要在Python中安装两个相关的模块(方法应该就是简单的pip install,不行就百度吧~)
beautifulsoup4(有些简称bs4, pip install beautifulsoup4):网页解析相关的模块
使用方法 from bs4 import BeautifulSoup
requests(pip install requests):用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作
使用方法直接 import requests
3、网页源码分析准备工作
打开一个待爬取内容的网页,打开开发者模式或者按F12即可看到相关的html的源码信息,chrome浏览器中鼠标停在源码某一行出,网页上相应的位置会高亮,所以很好定位到自己想要的信息对应的字段
4、敲代码
a、简单的获取网页信息,其中会遇到频繁访问某一个网站被视为攻击或者其他导致获取信息失败,
下面的try操作是最简单的防反爬取策略,延长访问时间间隔
最后的print语句可以将获取的html信息打印到终端
#Python自带的获取方式
url=url0+str(i)+"/#conghua"
html=""
for j in range(20):
try:
html=urlopen(url).read().decode('utf-8')
except Exception as e:
if j>=9:
time.sleep(10)
else:
time.sleep(0.5)
else:
time.sleep(0.1)
break
print(html)
b、当然了有些网站反爬取较强,所以需要更高以及的应对策略,使用requests模块,模拟浏览器访问
首先需要或者该网页对应的Request headers信息(自行百度吧~)
url=""#输入网址链接即可
headers={
"user-agent":"Mozilla/5.0(X11; Linux x86_64) AppleWebKit/537.36(KHTML, like "
"Gecko) Chrome/73.0.3683.86 Safari/537.36",
"accept":"text/html,application/xhtml+xml,application/xml;q = 0.9,image/webp,image/apng,*/*;q = 0.8",
"accept-language": "en-US,en;q = 0.9",
"accept-encoding":"gzip,deflate,br"
}#chorme
'''
headers={
"user-agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0",
"accept":"image/webp,*/*",
"accept-language": "en-US,en;q=0.5",
"accept-encoding":"gzip, deflate, br",
"connection":"keep-alive"
}#FireFox
'''
request=requests.get(url,headers=headers)
request.close()
request.encoding="utf-8"
html=request.text
print(html)
c、登录账号解决反爬取
这个仅仅作为总结记录,有待测试效果
#login settings
urlLogin = "......login"#登录界面网址
data = {
"action": "user_login",
"user_login":"username",
"user_pass": 'passward',
}
response = requests.post(urlLogin,data)
cookie = response.cookies.get_dict()
print(cookie)
url=”......“#爬取网页网址
request = requests.get(url, cookies=cookie)
request.close()
request.encoding = "utf-8"
html = request.text
print(html)
d、获取html信息后就是相关的解析提取自己想要的字段信息了
soup=BeautifulSoup(html,features="html.parser")
titles=soup.find_all("a",{"class":"name"})#根据各自的需求提取信息 主要根据网页源码信息进行修改这一句代码,也可以利用正则表达进行提取信息(这个暂时没有试)