上一篇文章大致讲了爬虫的五个基本步骤,还遗留了一个问题(目前都已解决)。在这里简单记录一下。
正则表达式,网上有很多对它知识的介绍,各种视频教学、各种文字说明、各种表格,作为一个新手(编程小小白),我坦白,确实没看懂。没办法,只有去请教下高手们了。后面也零零碎碎学到了一点,能够自己写出规则,匹配出想要的信息了。真不容易。
保姆式教学,步骤如下:
①先输出网页信息,并复制、粘贴到这个网址:regex101: build, test, and debug regex? 的2里面。
?②在1里面,开始编辑正则表达式规则,编辑的信息会在2里面标蓝,需要匹配的信息会在2里面标绿。比如匹配标题。(.*?)? ?这个就代表要匹配的信息所在的位子。
?③熟练掌握了上面的技巧之后,就可以写进代码里。首先,建立规则;其次,作匹配。
#设置正则表达式抓取规则
findTitle = re.compile(r' ')#标题,将1里面的内容复制粘贴到''里面
#匹配
data = []
item = str(item) #新建一个列表,方便存储所需要的信息
title = re.findall(findTitle,item)[0]
data.append(title)
datalist.append(data)
④写在最后。爬虫爬取信息固然很方便,但是要注意做好延时,用网文明。因为要写论文,所以这段时间零零散散学了些关于爬虫的知识,学得很浅,而且目前的代码还有很多可以优化的空间。希望大家可以一起学习,一起进步。下面附上这段时间来,爬取爱彼迎网站房源信息页的数据代码。
#coding=utf-8
from bs4 import BeautifulSoup #解析
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error
import xlwt #进行excel操作
import random
import time
def main():
baseurl = "https://www.airbnb.cn/s/%E5%8C%97%E4%BA%AC/homes?&items_offset=" #目标网址
datalist = getData(baseurl)
savepath = 'Airbnb.xls'
saveData(datalist,savepath)
#设置正则表达式抓取规则
findTitle = re.compile(r'<div class="_qrfr9x5".*?>(.*?)<')#民宿标题
findImgSrc = re.compile(r'<img alt.*?uri="(.*?)aki_policy=large"')#图片链接
findType = re.compile(r'<span style="color:#767676">(.*?)<')#民宿类型
findJudge = re.compile(r'<span class="_1clmxfj">(.*?)<')#评分与评论数
# findJudge1 = re.compile(r'<span class="_1clmxfj">(.*?)分')#评分
# findJudge2 = re.compile(r'<span class="_1clmxfj".*? · (.*?)条评论')#评论数
findSup1 = re.compile(r'<span class="_1pdh8u0">(.*?)<')#补充1 (超赞房东、低价优势、可开发票)最多3个
findSup2 = re.compile(r'<span class="_faldii7" style="color:#484848"><span>(.*?)<')#补充2 (其他)最多6个
findPrice = re.compile(r'<span>¥(.*?)<')#民宿价格
# findOther = re.compile(r'')#其他
def getData(baseurl):
datalist = []
for i in range(0,10000,1):
url = 'https://www.airbnb.cn/s/%E5%8C%97%E4%BA%AC/homes?&items_offset={}'.format(i) #??翻页
time.sleep(10)
# for i in range(10):
# url = requests.get(baseurl.replace('-pn_',str((i-1)*20)))
html = askURL(url)
time.sleep(7)
#2.主逐一解析网页
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div', class_="_fhph4u"):
data = []
item = str(item)
title = re.findall(findTitle,item)[0]
data.append(title)
imgsrc = re.findall(findImgSrc, item)[0]
data.append(imgsrc)
type = re.findall(findType, item)[0]
data.append(type)
judge = re.findall(findJudge, item)[0]
data.append(judge)
# judge1 = re.findall(findJudge1, item)[0]
# data.append(judge1)
#
# judge2 = re.findall(findJudge2, item)[0]
# data.append(judge2)
sup1 = re.findall(findSup1, item)[0]#最多输出三个[],但是如果只有两个就自动填充第一个,可不可以填充空格?
data.append(sup1)
sup2 = re.findall(findSup2, item)[0]#输出六个[],同上问
data.append(sup2)
price = re.findall(findPrice, item)[0]
data.append(price)
datalist.append(data)
# print(datalist)
time.sleep(5)
return datalist
def askURL(url):
proxy_list = [
IP池就先不共享了,建议大家自己找资源。
]
#绑定某个IP
proxy = random.choice(proxy_list)
urlhandle = urllib.request.ProxyHandler({'http': proxy})
opener = urllib.request.build_opener(urlhandle)
urllib.request.install_opener(opener)
headers = {
headers信息也不共享了,每个人的都不一样,具体怎么获取,前面有一篇文章有详细讲过。
}
#用户代理,模拟头部信息
req = urllib.request.Request(url,headers = headers)
html = ""
try:
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
time.sleep(random.randint(2,5))
return html
# 3.保存数据
def saveData(datalist, savepath):
book = xlwt.Workbook() # 创建
sheet = book.add_sheet('sheet1')
col = ["标题", "图片链接", "类型", "评分与评论数", "补充1", "补充2", "价格"]
for i in range(0, 7):
sheet.write(0, i, col[i])
for m in range(0, len(datalist)):
print("第%d条" % (m + 1))
data = datalist[m]
for j in range(0, 7):
print(data[j])
sheet.write(m + 1, j, data[j])
book.save(savepath)
if __name__ == '__main__': #当程序执行时调用函数
main()
print("爬取完毕!")
⑤如果不是想要爬取爱彼迎的信息的话,建议更改代码中这些部分:
?
爬虫目前就先学到这里了。后面会继续学习批量图片的HSV值采集与分析,以及内容文本的机器学习算法。欢迎大家一起交流与学习,为毕业而奋斗。
|