python3 爬虫---爬取糗事百科

这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1

分析网址,参数‘page/‘后面的数字‘1‘指的是页数,第二页就是‘/page/2‘,以此类推。。。

一、分析网页

网页图片

然后明确要爬取的元素:作者名、内容、好笑数、以及评论数量

每一个段子的信息存放在‘div id="content-left"‘下的div中

爬取元素的所在位置

二、爬取部分

  工具  

    Python3

   requests

   xpath

  1、获取每一个段子

1 # 返回页面的div_list
2     def getHtmlDivList(self, pageIndex):
3         pageUrl = ‘http://www.qiushibaike.com/hot/page/‘ + str(pageIndex)
4         html = requests.get(url=pageUrl, headers=self.headers).text
5         selector = etree.HTML(html)
6         divList = selector.xpath(‘//div[@id="content-left"]/div‘)
7         return divList

   

  每一个段子都在div中,这里用xpath,筛选出来后返回的是一个列表,每一个div都在里面

  

  2、获取每一个段子中的元素

 1     def getHtmlItems(self, divList):
 2
 3         items = []
 4
 5         for div in divList:
 6             item = []
 7             # 发布人
 8             name = div.xpath(‘.//h2/text()‘)[0].replace("\n", "")
 9             item.append(name)
10
11             # 内容(阅读全文)
12             contentForAll = div.xpath(‘.//div[@class="content"]/span[@class="contentForAll"]‘)
13             if contentForAll:
14                 contentForAllHref = div.xpath(‘.//a[@class="contentHerf"]/@href‘)[0]
15                 contentForAllHref = "https://www.qiushibaike.com" + contentForAllHref
16                 contentForAllHrefPage = requests.get(url=contentForAllHref).text
17                 selector2 = etree.HTML(contentForAllHrefPage)
18                 content = selector2.xpath(‘//div[@class="content"]/text()‘)
19                 content = "".join(content)
20                 content = content.replace("\n", "")
21             else:
22                 content = div.xpath(‘.//div[@class="content"]/span/text()‘)
23                 content = "".join(content)
24                 content = content.replace("\n", "")
25             item.append(content)
26
27             # 点赞数
28             love = div.xpath(‘.//span[@class="stats-vote"]/i[@class="number"]/text()‘)
29             love = love[0]
30             item.append(love)
31
32             # 评论人数
33             num = div.xpath(‘.//span[@class="stats-comments"]//i[@class="number"]/text()‘)
34             num = num[0]
35             item.append(num)
36
37             items.append(item)
38
39         return items

      这里需要注意的是,xpath返回的是一个列表,筛选出来后需要用[0]获取到字符串类型

      上面的代码中,爬取的内容里,有的段子是这样的,如下图:

          

     内容中会有标签<br>,那么用xpath爬取出来后,里面的内容都会成一个列表(这里的div就是列表),

     那div[0]就是"有一次回老家看姥姥,遇到舅妈说到表弟小时候的事~",所以需要将div转换成字符串  

     其他的部分就xpath语法的使用

  3、保存进文本

 1 # 保存入文本
 2     def saveItem(self, items):
 3         f = open(‘F:\\Pythontest1\\qiushi.txt‘, "a", encoding=‘UTF-8‘)
 4
 5         for item in items:
 6             name = item[0]
 7             content = item[1]
 8             love = item[2]
 9             num = item[3]
10
11             # 写入文本
12             f.write("发布人:" + name + ‘\n‘)
13             f.write("内容:" + content + ‘\n‘)
14             f.write("点赞数:" + love + ‘\t‘)
15             f.write("评论人数:" + num)
16             f.write(‘\n\n‘)
17
18         f.close()

  

  4、全部代码 

  1 import os
  2 import re
  3 import requests
  4 from lxml import etree
  5
  6
  7 # 糗事百科爬虫
  8 class QSBK:
  9     # 初始化方法,定义变量
 10     def __init__(self):
 11         self.pageIndex = 1
 12         self.headers = {
 13             "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"
 14         }
 15         self.enable = False
 16
 17     # 返回页面的div_list
 18     def getHtmlDivList(self, pageIndex):
 19         pageUrl = ‘http://www.qiushibaike.com/hot/page/‘ + str(pageIndex)
 20         html = requests.get(url=pageUrl, headers=self.headers).text
 21         selector = etree.HTML(html)
 22         divList = selector.xpath(‘//div[@id="content-left"]/div‘)
 23         return divList
 24
 25     # 获取文本中要截取的元素
 26     def getHtmlItems(self, divList):
 27
 28         items = []
 29
 30         for div in divList:
 31             item = []
 32             # 发布人
 33             name = div.xpath(‘.//h2/text()‘)[0].replace("\n", "")
 34             item.append(name)
 35
 36             # 内容(阅读全文)
 37             contentForAll = div.xpath(‘.//div[@class="content"]/span[@class="contentForAll"]‘)
 38             if contentForAll:
 39                 contentForAllHref = div.xpath(‘.//a[@class="contentHerf"]/@href‘)[0]
 40                 contentForAllHref = "https://www.qiushibaike.com" + contentForAllHref
 41                 contentForAllHrefPage = requests.get(url=contentForAllHref).text
 42                 selector2 = etree.HTML(contentForAllHrefPage)
 43                 content = selector2.xpath(‘//div[@class="content"]/text()‘)
 44                 content = "".join(content)
 45                 content = content.replace("\n", "")
 46             else:
 47                 content = div.xpath(‘.//div[@class="content"]/span/text()‘)
 48                 content = "".join(content)
 49                 content = content.replace("\n", "")
 50             item.append(content)
 51
 52             # 点赞数
 53             love = div.xpath(‘.//span[@class="stats-vote"]/i[@class="number"]/text()‘)
 54             love = love[0]
 55             item.append(love)
 56
 57             # 评论人数
 58             num = div.xpath(‘.//span[@class="stats-comments"]//i[@class="number"]/text()‘)
 59             num = num[0]
 60             item.append(num)
 61
 62             items.append(item)
 63
 64         return items
 65
 66     # 保存入文本
 67     def saveItem(self, items):
 68         f = open(‘F:\\Pythontest1\\qiushi.txt‘, "a", encoding=‘UTF-8‘)
 69
 70         for item in items:
 71             name = item[0]
 72             content = item[1]
 73             love = item[2]
 74             num = item[3]
 75
 76             # 写入文本
 77             f.write("发布人:" + name + ‘\n‘)
 78             f.write("内容:" + content + ‘\n‘)
 79             f.write("点赞数:" + love + ‘\t‘)
 80             f.write("评论人数:" + num)
 81             f.write(‘\n\n‘)
 82
 83         f.close()
 84
 85     # 判断文本是否已创建,添加路径
 86     def judgePath(self):
 87         if os.path.exists(‘F:\\Pythontest1‘) == False:
 88             os.mkdir(‘F:\\Pythontest1‘)
 89         if os.path.exists("F:\\Pythontest1\\qiushi.txt") == True:
 90             os.remove("F:\\Pythontest1\\qiushi.txt")
 91
 92     def start(self):
 93         self.judgePath()
 94         print("正在读取糗事百科,按回车继续保存下一页,Q退出")
 95         self.enable = True
 96         while self.enable:
 97             divList = self.getHtmlDivList(self.pageIndex)
 98             data = self.getHtmlItems(divList)
 99             self.saveItem(data)
100             print(‘已保存第%d页的内容‘ % self.pageIndex)
101             pan = input(‘是否继续保存:‘)
102             if pan != ‘Q‘:
103                 self.pageIndex += 1
104                 self.enable = True
105             else:
106                 print(‘程序运行结束!!‘)
107                 self.enable = False
108
109
110 spider = QSBK()
111 spider.start()

时间: 2024-08-16 20:50:24

python3 爬虫---爬取糗事百科的相关文章

Python爬虫爬取糗事百科段子内容

参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码: #coding=utf-8#!/usr/bin/pythonimport urllibimport urllib2import reimport threadimport timeimport sys #定义要抓取的网页#url = 'http://www.qiushibaike.com/hot/'#读取要抓取的网页#globalcontent = urllib.urlopen(url).read()#抓取段子内容#new_

Python爬虫-爬取糗事百科段子

闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/hot/page/2/    末尾2指第2页 2.先抓取HTML页面 import urllib import urllib2 import re page = 2 url = 'http://www.qiushibaike.com/hot/page/' + str(page) #对应第2页的url

爬虫 爬取糗事百科热门板块的信息

分析: 1.先查看返回的内容是否与显示的内容一样 2.再看页数的变化,每次会加一,总共13页,因此可以一次性构造地址列表 3.因此可直接结合 chrome插件 xpath helper 与 elemetns显示的内容进行定位要爬取的内容 用到的模块 requests+json+lxml+xpath 下面是代码: import requests import json from lxml import etree class QiubaiSpider: def __init__(self): se

python beautifulsoup bs4爬虫 爬取糗事百科

声明:仅用于学习语法,请勿用于非法用途 import urllib.request import re from bs4 import BeautifulSoup # -*- coding:utf-8 -*- url = 'http://www.qiushibaike.com/hot/' user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers={'User-Agent':user_agent} request = u

python3 爬虫之爬取糗事百科

闲着没事爬个糗事百科的笑话看看 python3中用urllib.request.urlopen()打开糗事百科链接会提示以下错误 http.client.RemoteDisconnected: Remote end closed connection without response 但是打开别的链接就正常,很奇怪不知道为什么,没办法改用第三方模块requests,也可以用urllib3模块,还有一个第三方模块就是bs4(beautifulsoup4) requests模块安装和使用,这里就不说

爬虫实战 爬取糗事百科

偶然看到了一些项目,有爬取糗事百科的,我去看了下,也没什么难的 首先,先去糗事百科的https://www.qiushibaike.com/text/看一下, 先检查一下网页代码, 就会发现,需要爬取的笑话内容在一个span标签里,而且父标签是class为content的div里,那就很简单了,用select方法,先找到该文件,然获取下来并保存在txt文件里.比较枯燥. 直接贴代码吧 from bs4 import BeautifulSoup import lxml import request

爬取糗事百科的图片

小编,最近写了个单线程的爬虫,主要是爬取糗事百科的图片之类的,下面是源代码,小伙伴们可以拿去参照,学习 #!/usr/bin/env python# -*- coding:utf-8 -*-import requests,jsonimport requests,re,os,timeimport urllib.requestimport urllib.parseimport sslimport unittestfrom selenium import webdriver headers = {"U

PHP爬取糗事百科首页糗事

突然想获取一些网上的数据来玩玩,因为有SAE的MySql数据库,让它在那呆着没有什么卵用!于是就开始用PHP编写一个爬取糗事百科首页糗事的小程序,数据都保存在MySql中,岂不是很好玩! 说干就干!首先确定思路 获取HTML源码--->解析HTML--->保存到数据库 没有什么难的 1.创建PHP文件"getDataToDB.php", 2.获取指定URL的HTML源码 这里我用的是curl函数,详细内容参见PHP手册 代码为 <span style="fo

使用Python爬取糗事百科热门文章

默认情况下取糗事百科热门文章只有35页,每页20条,根据下面代码可以一次性输出所有的文章,也可以选择一次输出一条信息,回车继续.不支持图片内容的显示,显示内容包括作者,热度(觉得好笑的人越多,热度越高),内容.从热度最高开始显示到最低.实现代码如下: #!/usr/bin/python #coding:utf8 """ 爬取糗事百科热门文章 """ import urllib2 import re #模拟浏览器访问,否则无法访问 user_age