一条爬虫抓取一个小网站所有数据

打印 上一主题 下一主题

主题 935|帖子 935|积分 2805

一条爬虫抓取一个小网站所有数据

​        今天闲来无事,写一个爬虫来玩玩。在网上冲浪的时候发现了一个搞笑的段子网,发现里面的内容还是比较有意思的,于是心血来潮,就想着能不能写一个Python程序,抓取几条数据下来看看,一不小心就把这个网站的所有数据都拿到了。

​        这个网站主要的数据都是详情在HTML里面的,可以采用lxml模块的xpath对HTML标签的内容解析,获取到自己想要的数据,然后再保存在本地文件中,整个过程是一气呵成的。能够抓取到一页的数据之后,加一个循环就可以抓取到所有页的数据,下面的就是数据展示。

废话少说,直接上Python代码
  1. import requests
  2. import csv
  3. from lxml import etree
  4. import time
  5. class Page:
  6.     def __init__(self):
  7.         self.pre_url = "https://www.biedoul.com"
  8.         self.start_page = 1
  9.         self.end_page = 15233
  10.     def askHTML(self, current_page, opportunity):
  11.         print(
  12.             "=============================== current page => " + str(current_page) + "===============================")
  13.         try:
  14.             pre_url = self.pre_url + "/index/" + str(current_page)
  15.             page = requests.get(url=pre_url)
  16.             html = etree.HTML(page.content)
  17.             articles = html.xpath('/html/body/div/div/div/dl')
  18.             return articles
  19.         except Exception as e:
  20.             if opportunity > 0:
  21.                 time.sleep(500)
  22.                 print(
  23.                     "=============================== retry => " + str(opportunity) + "===============================")
  24.                 return self.askHTML(current_page, opportunity - 1)
  25.             else:
  26.                 return None
  27.     def analyze(self, articles):
  28.         lines = []
  29.         for article in articles:
  30.             data = {}
  31.             data["link"] = article.xpath("./span/dd/a/@href")[0]
  32.             data["title"] = article.xpath("./span/dd/a/strong/text()")[0]
  33.             data["content"] = self.analyze_content(article)
  34.             picture_links = article.xpath("./dd/img/@src")
  35.             if (picture_links is not None and len(picture_links) > 0):
  36.                 # print(picture_links)
  37.                 data["picture_links"] = picture_links
  38.             else:
  39.                 data["picture_links"] = []
  40.             # data["good_zan"] = article.xpath("./div/div/a[@class='pinattn good']/p/text()")[0]
  41.             # data["bad_bs"] = article.xpath("./div/div/a[@class='pinattn bad']/p/text()")[0]
  42.             data["good_zan"] = self.analyze_zan(article, "good")
  43.             # article.xpath("./div/div/a[@class='pinattn good']/p/text()")[0]
  44.             data["bad_bs"] = self.analyze_zan(article, "bad")
  45.             # article.xpath("./div/div/a[@class='pinattn bad']/p/text()")[0]
  46.             lines.append(data)
  47.         return lines
  48.     # 解析文章内容
  49.     def analyze_content(self, article):
  50.         # 1. 判断dd标签下是否为文本内容
  51.         content = article.xpath("./dd/text()")
  52.         if content is not None and len(content) > 0 and not self.is_empty_list(content):
  53.             return content
  54.         content = []
  55.         p_list = article.xpath("./dd")
  56.         for p in p_list:
  57.             # 2. 判断dd/.../font标签下是否为文本内容
  58.             if len(content) <= 0 or content is None:
  59.                 fonts = p.xpath(".//font")
  60.                 for font_html in fonts:
  61.                     font_content = font_html.xpath("./text()")
  62.                     if font_content is not None and len(font_content) > 0:
  63.                         content.append(font_content)
  64.             # 3. 判断dd/.../p标签下是否为文本内容
  65.             if len(content) <= 0 or content is None:
  66.                 fonts = p.xpath(".//p")
  67.                 for font_html in fonts:
  68.                     font_content = font_html.xpath("./text()")
  69.                     if font_content is not None and len(font_content) > 0:
  70.                         content.append(font_content)
  71.         return content
  72.     def analyze_zan(self, article, type):
  73.         num = article.xpath("./div/div/a[@class='pinattn " + type + "']/p/text()")
  74.         if num is not None and len(num) > 0:
  75.             return num[0]
  76.         return 0
  77.     def do_word(self):
  78.         fieldnames = ['index', 'link', 'title', 'content', 'picture_links', 'good_zan', 'bad_bs']
  79.         with open('article.csv', 'a', encoding='UTF8', newline='') as f:
  80.             writer = csv.DictWriter(f, fieldnames=fieldnames)
  81.             # writer.writeheader()
  82.             for i in range(self.start_page, self.end_page):
  83.                 articles = self.askHTML(i, 3)
  84.                 if articles is None:
  85.                     continue
  86.                 article_list = self.analyze(articles)
  87.                 self.save(writer, article_list)
  88.     # 保存到文件中
  89.     def save(self, writer, lines):
  90.         print("##### 保存中到文件中...")
  91.         # python2可以用file替代open
  92.         print(lines)
  93.         writer.writerows(lines)
  94.         print("##### 保存成功...")
  95.     def is_empty_list(self, list):
  96.         for l in list:
  97.             if not self.empty(l):
  98.                 return False
  99.         return True
  100.     def empty(self, content):
  101.         result = content.replace("\r", "").replace("\n", "")
  102.         if result == "":
  103.             return True
  104.         return False
  105.     # 递归解析文章内容
  106.     def analyze_font_content(self, font_html, depth):
  107.         content = []
  108.         print(depth)
  109.         font_content_list = font_html.xpath("./font/text()")
  110.         if font_content_list is not None and len(font_content_list) > 0 and not self.is_empty_list(font_content_list):
  111.             for font_content in font_content_list:
  112.                 content.append(font_content)
  113.         else:
  114.             if depth < 0:
  115.                 return []
  116.             return self.analyze_font_content(font_html.xpath("./font"), depth - 1)
  117.         return content
  118. if __name__ == '__main__':
  119.     page = Page()
  120.     page.do_word()
复制代码
在运行下面的代码之前,需要先按照好requests、lxml两个模块,安装命令为:
  1. pip installl requests
  2. pip install lxml
复制代码
大家对这个爬虫有什么疑问,欢迎给我留言。如果大家对于我这个爬虫创意还不错的话,记得关注微信公众号【智享学习】哟,后续我会分享更多有意思的编程项目。
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表