本人python小白,近一个月在学习python编程,发现python强大的第三方库简直是小白的福音。

因此把学习用的知识做了一个小的糗百段子抓取程序,大神就不要看了,新手相互学习交流一下。

还要再感谢一下无私分享学习资源的各位朋友!

废话不多说,上码:

duanzi.py原码

------------------------------------------------------------------------------------------------
import re
import urllib
import io
import urllib.request
import random
class  duanzi_get:
def __init__(self,  url,  page_number):
#类的初始化函数,创建对象时需要传入指定的参数
self.url = url                            #指定要爬取的url
self.page_number = page_number            #要爬取的页面数目
self.user_agnet  = [
#为了防止被反爬虫,预定义user-agent列表
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
]
def  load_page(self, temp_list):
#爬取指定url并保存在list中
index = 1
index_user_agnet = 0
#当没有达到指定爬取页面数量时,循环继续
while  index<=self.page_number :
'''
因为糗事百科每一页的url地址很有规律
https://www.qiushibaike.com/text/page/1/
https://www.qiushibaike.com/text/page/2/
...
https://www.qiushibaike.com/text/page/n/
因此选择循环处理url
'''
url_current = self.url+str(index) +'/'
print('当前请求页面:', url_current )     #打印当前要爬取的url
#如果指定user-anget超出list范围,从头开始指定
if index_user_agnet>len(self.user_agnet):
index_user_agnet = 0
#选择user-agent并打印
ug = {"User-Agent":self.user_agnet[index_user_agnet]}
print('动态选择user-agnet:', ug )
#创建http request 注意我用的是python3.6  使用urllib.request可以完成urllib2的功能
request = urllib.request.Request( url_current, headers=ug )
urlop   = urllib.request.urlopen( request )
html    = urlop.read( )
#使用io模块下StringIO对response响应的数据做转码处理
compress_stream = io.StringIO(html.decode('utf-8'))
#将转码后的数据加入到列表
temp_list.append(compress_stream)
#对索引变量自增处理
index += 1
index_user_agnet += 1
demo.py 原码
-----------------------------------------------------------------------------------------------------------
import duanzi
import io
import datetime
from bs4 import BeautifulSoup
def main( ):
#最终爬取后存储每条段子的list
text_list=[]
#参数1  要爬取的url
#参数2  指定要爬取的页数
dz = duanzi.duanzi_get("https://www.qiushibaike.com/text/page/", 4)
#记录爬取的页面列表
html = [ ]
dz.load_page( html )
index = 0   #记录爬取到的段子个数
#对抓取到的页面list进行遍历
for src in html:
#BeautifulSoup模块不是python3.6自带
#需要使用 pip install BeautifulSoup进行安装
#pip的安装步骤有时间我在发帖详细说明
soup = BeautifulSoup(src, 'html.parser')
#查找当前页面下的所有class为content的 
 
 
#因为每条段子都在一个
links = soup.find_all('div', class_='content')
for  link in links:
#对已经定位到的div标签再做细化查找,每一条段子都使用了一个标签
#因此找到标签  并获取标签的text内容即为一条段子
str_text  = link.find('span').get_text( )
#为了存储在文本中的时候好看
#我对每个段子添加了一个格式化的序号
str_index = "%-3d."%index
#抓取到的段子里面有很多的换行符
#先统一去除所有的换行符,然后再给每一条段子最后加一个换号,用于文本存储时换行
str_text  = str_index+str_text.replace("\n","")+"\n\n"
#对处理过个时候的段子,添加到list中
text_list.append(str_text)
#段子有序号,不要忘了给段子的序号自增
index += 1
#打印一下本次抓取到了几条段子
print("本次爬取到段子{}条".format(len(text_list)))
#使用detetime模块格式化记录段子的文本文件名称
file_name = "D:/糗事百科{}.txt".format(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))
#之前遇到部分段子写入的时候报错,因此以utf-8编码格式打开文件
f = open(file_name,'a+',encoding='utf-8')
#遍历段子列表,将每一条段子写入文本
for text in text_list:
f.write(text)
#关闭文本
f.close( )
if __name__ == '__main__':
main( )