
所需要引入的库,python版本号不同,加入#coding=gbk,避免正文中出现中文时报错。

爬取的内容,跟路径在开发者模式中选择

包裹的内容。 现在我们想获取发布人,发布日期,段子内容,以及点赞的个数。不过另外注意的是,段子有些是带图片的,如果我们想在控制台显示图片是不现实的,所以我们直接把带有图片的段子给它剔除掉,只保存仅含文本的段子。 所以我们加入如下正则表达式来匹配一下,用到的方法是 re.findall 是找寻所有匹配的内容。方法的用法详情可以看前面说的正则表达式的介绍。 好,我们的正则表达式匹配语句书写如下,在原来的基础上追加如下代码

现在正则表达式在这里稍作说明 1).? 是一个固定的搭配,. 和代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .? 的搭配。 2)(.?) 代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历 item 中,item [0] 就代表第一个 (.?) 所指代的内容,item [1] 就代表第二个 (.?) 所指代的内容,以此类推。 3)re.S 标志代表在匹配时为点任意匹配模式,点。也可以代表换行符。 这样我们就获取了发布人,发布时间,发布内容,附加图片以及点赞数。 在这里注意一下,我们要获取的内容如果是带有图片,直接输出出来比较繁琐,所以这里我们只获取不带图片的段子就好了。 所以,在这里我们就需要对带图片的段子进行过滤。 我们可以发现,带有图片的段子会带有类似下面的代码,而不带图片的则没有,所以,我们的正则表达式的 item [3] 就是获取了下面的内容,如果不带图片,item [3] 获取的内容便是空。

最后完整的代码是:
# coding=gbk
import requests
from lxml import etree
import json
import xlwt
import os
def get_Page(url):
# 构建请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
# 从网站分析出响应内容的编码
# print(response.encoding)
response.encoding = 'UTF-8'
# print(response.text)
return response.text
else:
print("请求网页失败")
def parse_Page(html):
html_lxml = etree.HTML(html)
# 获取到每一块的所有内容
datas = html_lxml.xpath('//li[contains(@id,"qiushi_tag")]')
item = {}
for data in datas:
# print(data.attrib)
# 用户名称
作者名 = data.xpath('.//a[@class="recmd-user"]/span/text()')
# 糗事内容
糗事内容 = data.xpath('.//a')[1].text.strip()
# # 评论数
评论数量 = data.xpath('.//div[@class="recmd-num"]/span[4]/text()')
# # 好笑数
点赞数 = data.xpath('.//div[@class="recmd-num"]/span[1]/text()')
# # 图片
图片 = data.xpath('.//a[1]/img/@src')
item = {
'作者名': 作者名,
'糗事内容': 糗事内容,
'评论数量': 评论数量,
'点赞数': 点赞数,
'图片': 图片[0]
}
print(item['作者名'])
js = json.dumps(item)
file = open('test.txt', 'a',encoding='utf-8')
file.write(str(item)+'\n')
file.close()
print(item['糗事内容'])
js = json.dumps(item)
file = open('test.txt', 'a', encoding='utf-8')
file.write(str(item) + '\n')
file.close()
print(item['评论数量'])
js = json.dumps(item)
file = open('test.txt', 'a', encoding='utf-8')
file.write(str(item) + '\n')
file.close()
print(item['点赞数'])
js = json.dumps(item)
file = open('test.txt', 'a', encoding='utf-8')
file.write(str(item) + '\n')
file.close()
print(item['图片'])
js = json.dumps(item)
file = open('test.txt', 'a', encoding='utf-8')
file.write(str(item) + '\n')
file.close()
def main(num):
for index in range(num):
url = 'https://www.qiushibaike.com/8hr/page/' + str(index)
html = get_Page(url)
parse_Page(html)
if __name__ == '__main__':
main(3)
def txt_xls(filename, xlsname):
try:
f = open(filename, 'r', encoding='utf-8')
xls = xlwt.Workbook()
sheet = xls.add_sheet('sheet1', cell_overwrite_ok=True)
x = 0
while True:
# 按行循环,读取文本文件
line = f.readline()
if not line:
break
for i in range(len(line.split('\t'))):
item = line.split('\t')[i]
sheet.write(x, i, item)
x += 1
f.close()
xls.save(xlsname) # 保存xls文件
except:
raise
if __name__ == "__main__":
filename = "C:\\Users\\xiaofeng\\PycharmProjects\\pythonProject1\\test.txt" # 需要转化的文件
xlsname = "C:\\Users\\xiaofeng\\PycharmProjects\\pythonProject1\\test.xls" # 保存及命名
txt_xls(filename, xlsname)
os.startfile('test.xls')
其中跟路径需要变化,否则会报错,最后会生成两个文件

并自动打开xls文件,其中txt文件为

xls文件为

这就是我们python爬取糗事百科的全部内容
