欢迎捧场,这次我们爬取糗事百科的幽默笑话大全,这里边只有文字内容,处理比较方便。
为了匹配我们需要的笑话内容,我们选择用正则表达式来处理。
.匹配任意字符,换行符除外,一个占位符
*匹配前一个字符0次或无限次,
?匹配前一个字符0次或者1次
.*贪心算法
.*?非贪心算法
() 括号内的数据作为结果返回indall: 匹配所有符合规律的内容,返回包含结果的列表
Search: 匹配并提取第一个符合规律的内容,返回一个正则表达式对象
Sub: 替换符合规律的内容,返回替换后的值
我们爬取的当前页的url为http://www.qiushibaike.com/text/ ,第二页的url为http://www.qiushibaike.com/text/page/2/ ,如果我们在地址栏中输入http://www.qiushibaike.com/text/page/1/,你会发现,页面会跳到你需要爬取页面的首页,这样就很方便我们处理了,我们可以用正则表达式匹配url的内容,然后替换掉。
re.sub('/page/\d','/page/%d'%i,old_url,re.S)
获取到每个带爬取页面的url之后,我们看一下需要处理的笑话内容。
可以发现,笑话的内容都放在 class=”content” 的块级元素中,则可以使用以下正则表达式。
re.findall('<div class="content">(.*?)</div>',source,re.S)
在处理完url和笑话内容的匹配后,我们可以把程序写出来如下:
#coding='utf-8'
#爬糗百的段子
import re
import requests
import time
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
class spider():
def getUrl(self,old_url,total_page):
all_links=[]
for i in range(1,total_page+1):
new_url=re.sub('/page/\d','/page/%d'%i,old_url,re.S)
all_links.append(new_url)
return all_links
def getSource(self,url):
header={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
payload = {
's': '4907062',
}
html=requests.get(url,headers=header,params=payload)
return html.text
def getContent(self,source):
content=re.findall('<div class="content">(.*?)</div>',source,re.S)
return content
def saveFile(self,info):
f=open('info.txt','a')
for each in info:
f.writelines(each.decode('utf-8'))
f.close()
if __name__=='__main__':
contents=[]
url_qiubai='http://www.qiushibaike.com/text/page/1/'
total_page=20
qiubaiSpider=spider()
links=qiubaiSpider.getUrl(url_qiubai,total_page)
for link in links:
print('准备爬取'+link)
a=qiubaiSpider.getSource(link)
content=qiubaiSpider.getContent(a)
#print('准备爬取'+link)
for x in content:
contents.append(x.encode('utf-8'))
print(x)
time.sleep( 1 )
qiubaiSpider.saveFile(contents)
最后有一个编码的问题,再保存文件的时候没有解决,抱歉。下次学习爬取网页图片,先给各位老司机安利一个网站:妹子图;一起努力进步吧。