python爬虫学习1
时间:2021.7.24
实战1:爬取某网站新书速递基本信息
1、目的:检验对爬虫程序书写的流程,正则表达式的简单应用。
2、基本流程
1.需要用到的库
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error
2.爬取网页源码
#获取网页源码
def askURL(url):
head = { #模拟浏览器头部信息,向豆*服务器发送消息
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36"
}
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
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)
return html
需要注意的问题:
此处需要模拟浏览器头部信息发送给服务器,因为服务器的响应包里会显示你是一只赤裸裸的爬虫,如果服务器加以过滤,爬取就会失败。所以伪装很有必要,这里只是简单地伪装。
head = { #模拟浏览器头部信息,向豆*服务器发送消息
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36"
}
2.正则表达式的构建
根据源码中书名、作者、出版社对应的H5代码对应规则构建正则表达式
例如:
#构造筛选的正则表达式
#re.S主要是考虑换行符
bookName = re.compile(r'<h4 class="title">(.*?)</h4>',re.S)
bookAuthor = re.compile(r'<div class="author">(.*?)</div>',re.S)
bookPublisher =re.compile(r'<span class="publisher">(.*?)</span>',re.S)
注意:re.S主要是考虑换行符,如下
<h4 class="title">
人类状况百科全书(上下册)
</h4>
`#正则匹配的时候如果不考虑换行符就会匹配失败
3.获取数据,存入列表中
后期存入数据或者EXCEL可自行增加一个函数将该列表存入即可。
需要注意的问题有:
存入时过滤掉爬下来的多余的空格、换行符等特殊字符。
附上源码,本文结束。
# 作者:QiQi_Cliff
# 时间:2021.7.24
#爬取豆*读书书名
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error
#主函数
def main():
baseurl = "https://book.dou*.com/"
datalist = getData(baseurl)
print(datalist)
return 0
#构造筛选的正则表达式
bookName = re.compile(r'<h4 class="title">(.*?)</h4>',re.S)
bookAuthor = re.compile(r'<div class="author">(.*?)</div>',re.S)
bookPublisher =re.compile(r'<span class="publisher">(.*?)</span>',re.S)
#从网页源码中拿数据
def getData(baseurl):
datalist = []
html = askURL(baseurl)
soup = BeautifulSoup(html,"html.parser")#定位特定标签的位置
i = 0
for item in soup.find_all('div',class_="info"):
if(i>=10):break
i += 1
data = [i]#将每一本书的信息都保存在列表中,最终汇总入datalist[]
#查找符合要求的字符串,形成列表
item = str(item)
#print(item)
#1.书名
name = re.findall(bookName,item)[0] #此处这样做的原因就是:re.findall()函数得到的是一个列表,我们只需要还列表的第一个元素,即书名
name = re.sub('<br(\s+)?/>(\s+)?'," ",name) #去掉<br/>
name = re.sub('/'," ",name)
data.append(name.strip())
#2.作者
author = re.findall(bookAuthor,item)[0] #此处这样做的原因就是:re.findall()函数得到的是一个列表,我们只需要还列表的第一个元素,即书名
author = re.sub('<br(\s+)?/>(\s+)?'," ",author) #去掉<br/>
author = re.sub('/'," ",author)
data.append(author.strip())
#3.出版社
publisher = re.findall(bookPublisher,item)[0] #此处这样做的原因就是:re.findall()函数得到的是一个列表,我们只需要还列表的第一个元素,即书名
publisher = re.sub('<br(\s+)?/>(\s+)?'," ",publisher) #去掉<br/>
publisher = re.sub('/'," ",publisher)
data.append(publisher.strip())
datalist.append(data)
return datalist
#模拟浏览器头部信息,向豆*服务器发送消息
#获取网页源码
def askURL(url):
head = { #模拟浏览器头部信息,向豆*服务器发送消息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36 Edg/91.0.864.71"
}
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")#防止解码错误
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
#启动的主函数
if __name__ == "__main__": #当程序执行时
#调用函数
main()
print("爬取完毕!")
部分源代码参考IT私塾,希望本文对你有帮助。python小白第一次发文还请大家多多指教/握拳。