这里首先说下python的第三方库,python之所以强大并渐渐流行起来,一部分的原因要归功于python强大的第三方库。作业用户就不用了解底层的原理,用最少的代码写更多的功能。
爬虫的三大常用库
Requests库,BeautifualSoup库和Lxml库
安装方法:
这里说下用pip命令安装,pip install name(需要安装库的名称)
例如:pip install BeautifualSoup4, pip install Requests
Requests库
Requests库的作用就是请求网站获取网页数据的。让我们从简单的实例开始讲解Requests库的使用方法。
import requests
#获取百度页面的html
res = requests.get("http://www.baidu.com")
#pycharm中返回的结果为<Response[200]>,说明请求网址成功,如果状态码为404,400则表示请求网址失败。
print "状态:",res
print res.text
#pycharm部分结果如下
BeautifulSoup库
BeautifulSoup库是一个非常流行的Python模块,我们通过BeautifulSoup库可以轻松的解析Requests库请求的网页,并把网页源代码解析为Soup文档,以便过滤提取数据。
import requests
from bs4 import BeautifulSoup
#请求头
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
res = request.get("http://www.baidu.com",headers)
#html.parser是用来解析HTML的,也可以用lxml来解析
soup = BeautifulSoup(res.text,"html.parser")
#prettify()格式化输出
print soup.prettify()
结果如下
Lxml库
lxml库是基于libxm12这一个XML解析库的Python封装。该模块使用C语言编写,解析速度比BeautifulSoup更快,具体使用以后再说
示例(一),爬取地区租房信息
(1)爬取小猪短租北京地区的短租房13页的信息,通过浏览,对比前三页的网址:
bj.xiaozhu.com/
bj.xiaozhu.com/search-duanzufang-p2-0/
http://bj.xiaozhu.com/search-duanzufang-p3-0/
发现只需要更改P后面的数字即可跳转到相应的页面
(2)本次爬虫在详细页中进行,所有需要爬取进入到详细页的网址链接,进而爬取数据。
(3)需要爬取的信息有:标题,地址,价格,房东名称,房东头像链接,具体如下图所示
具体的代码如下
# -*- encoding:utf8 -*-
import requests
from bs4 import BeautifulSoup
import itertools
import time
# 请求头,用来模拟浏览器
# 1.类选择器class:“.class”
# 2. id 选择器:“#id”
# 3.派生选择器:“p strong”
# 4.属性选择器:“[title] / [title=te]”
headers = {
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
# 性别的判断,性别为女的标签类名为member_ico1
def judgment_sex(class_name):
if class_name == ["member_ico1"]:
return "女"
else:
return "男"
# 定义获取详细url(每页的房源url)的函数
def get_links(url):
wb_data = requests.get(url,headers=headers)
soup = BeautifulSoup(wb_data.text,"lxml")
# 获取id为page_list下的ul,ul下的li,li下面的a标签,返回的是一个a标签数组
links = soup.select("#page_list > ul > li > a")
for link in links:
# 获取a标签里面的href属性
href = link.get("href")
time.sleep(2)
# 依次调用get_info函数,把获取的链接传入进去
get_info(href)
#获取网页具体信息的函数
def get_info(url):
wb_data = requests.get(url,headers=headers)
soup = BeautifulSoup(wb_data.text,"lxml")
# 获取标题,标题在class=pho_info的一个div里面
titles = soup.select("div.pho_info > h4")
# 获取地址
addressses = soup.select("span.pr5")
# 获取价格
prices = soup.select("#pricePart > div.day_l > span")
# 获取房东图片链接
imgs = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
# 获取房东姓名
names = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
# 获取房东性别
sexs = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')
# itertools.izip()可以平行迭代多个数组
for title,address,price,img,name,sex in itertools.izip(titles,addressses,prices,imgs,names,sexs):
data = {
# Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
"title":title.text.strip(),
"address":address.text.strip(),
"price":price.text,
"img":img.get("src"),
"name":name.text,
"sex":judgment_sex(sex.get("class"))
}
print data
# pyhton中程序的主入口
if __name__ == "__main__":
# 构建多页的url,后期可以用scrapy跟进爬取
urls = ["http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(number) for number in range(1,14)]
for begin in urls:
# 循环调用get_links函数
get_links(begin)
# 睡眠4秒,防止访问频率过高无法访问
time.sleep(4)
具体可以实现,但是这个网址有反爬虫,结果很尴尬多试了几次后就显示下面这样的情况,一开始解除限制后还可以继续爬取,但是多试了几次后就不能再爬了,等下次什么时候再可以访问的时候再去爬取,,,
操作的过程中有个有趣的事,就是如果你一边运行爬虫一边自己继续浏览网页,基本不会被封,就写到这里吧,后面再去细学如何防止爬虫被封杀
附:第二天我又试了下,又可以访问了,于是尝试一边爬一边浏览网页,结果和我猜测的一样,一边浏览网页一边爬取网页的话不会出现访问过于频繁,而且爬取了很多的数据,如下图