Python语言在最近几年之间发展迅猛,比较喜欢用Python来写一些爬虫。Python爬虫因为有极其丰富和功能强大的库在爬虫领域占据领导地位,以下的文章将以一个新手的姿态来记录下用Python写爬虫的历程,也可以为想学习爬虫的人提供一个简单的教程。
1,分析糗事百科的网页源代码。
2,构建提取相应的正则表达式。
3,写出算法来提取相应内容。
4,遇到的一些问题和小窍门。
对于糗事百科,我们提取的主要是两个部分,一个是“发帖人”另一个就是“发帖人的段子”。
在网页里,我们需要找到“爱在天涯AA”还有以下的“段子”就是我们需要爬取的东西了。
1,分析糗事百科的网页源代码。
网页源代码如下,我截取了一部分的的代码片段。
在代码中,我们很清楚的看到“发帖人”和“段子”,相应的代码部分我们也看到了,更明白了它的结构,<h2>发帖人</h2> ,<span>段子</span>。分析到这里就足够了!
2,构建提取相应的正则表达式。
依据很简单的正则表达式规则,我们就可以得出他们的正则表达式:userpat='<h2>(.*?)</h2>' , contentpat='<span>(.*?)</span>'
3,写出算法来提取相应内容。
相应的算法如下,通过for循环来不断的获取网页内容。
import re
import urllib.request
def getUserName(url,page):
#模拟浏览器登陆
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read().decode("utf-8")
userpat='<h2>(.*?)</h2>'#相应的正则表达式
contentpat='<span>(.*?)</span>'
usernamelist=re.compile(userpat,re.S).findall(data)#得到一个列表(关于发帖人的)
contentlist=re.compile(contentpat,re.S).findall(data)#得到一个列表(关于段子的)
x=1
for username in usernamelist:
print("用户"+str(page)+'-'+str(x)+"是:"+str(username))
print(str(contentlist[x]))
x+=1
for i in range(1,4):
url="https://www.qiushibaike.com/8hr/page/"+str(i)#获取它的网页(从第一页到第三页)
getUserName(url,i)
print(str(i))
最后爬下的结果如下:
4,遇到的一些问题和小窍门。
可能有一些心细的人会发现段子文本中存在一些不可去除的符号<br/>。
解决方法有两种:一,完善它的正则表达式(能力有限,我还不会)。二,从抓取的data里面将<br/>换成""(用到了re.sub()函数)。我选择了第二种方法,实现起来比较简单。
修改后的代码如下:
import re
import urllib.request
def getUserName(url,page):
#模拟浏览器登陆
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read().decode("utf-8")
userpat='<h2>(.*?)</h2>'#相应的正则表达式
contentpat='<span>(.*?)</span>'
conpat='<br/>'#替代的正则表达式
data=re.sub(conpat,"",data)#替换函数
usernamelist=re.compile(userpat,re.S).findall(data)#得到一个列表(关于发帖人的)
contentlist=re.compile(contentpat,re.S).findall(data)#得到一个列表(关于段子的)
x=1
for username in usernamelist:
print("用户"+str(page)+'-'+str(x)+"是:"+str(username))
print(str(contentlist[x]))
x+=1
for i in range(1,4):
url="https://www.qiushibaike.com/8hr/page/"+str(i)#获取它的网页(从第一页到第三页)
getUserName(url,i)
print(str(i))
最后亲测有效,比较好的解决了这个问题。