当前位置:   article > 正文

Python爬虫实战——爬取新闻数据(简单的深度爬虫)_爬取新闻网站上的所有详细结果

爬取新闻网站上的所有详细结果

前言

        又到了爬新闻的环节(好像学爬虫都要去爬爬新闻,没办法谁让新闻一般都很好爬呢XD,拿来练练手),只作为技术分享,这一次要的数据是分在了两个界面,所以试一下深度爬虫,不过是很简单的。

数据目标

相关库

  1. import openpyxl
  2. import requests
  3. from lxml import etree
  4. from tqdm import tqdm

数据爬取 

 网页url

url = 'https://www.chinanews.com.cn/scroll-news/news1.html'

1.先看看网站网址的规律

 发现这部分就是每一天的新闻,现在把这个链接组合一下,我暂时只拿1月份的数据

  1. # 组合日期链接
  2. def cnew_url():
  3. f = open(r'D:/工作文件/cnew_url.txt', 'w', encoding='utf8')
  4. for i in range(1, 32):
  5. if i < 10:
  6. url = 'https://www.chinanews.com.cn/scroll-news/2023/010' + str(i) + '/news.shtml'
  7. else:
  8. url = 'https://www.chinanews.com.cn/scroll-news/2023/01' + str(i) + '/news.shtml'
  9. f.write(url + '\n')
  10. f.close()

2.接下来访问每一天的链接获取到新闻的链接还有我们需要的分类的数据,然后再对新闻链接发起request请求获取到我们需要的标题和正文数据

  1. def cnew_data():
  2. f = open(r'D:/工作文件/cnew_url.txt', encoding='utf8') # 读取上面已经组合好的链接
  3. l = openpyxl.load_workbook(r'D:\工作文件\cnew_data.xlsx')
  4. sheet = l.active
  5. m = open(r'D:/工作文件/cnew_url1.txt', 'a', encoding='utf8') # 保存报错的链接
  6. x = 1 # 从Excel的第几行开始写入
  7. for i in f:
  8. lj1 = []
  9. # 发起请求,获取页面里面的新闻链接
  10. req = requests.get(i.replace('\n', ''), headers=headers)
  11. # 设置网页编码,不设置会乱码
  12. req.encoding = 'utf8'
  13. ht = etree.HTML(req.text)
  14. # 获取分类的数据还有正文链接
  15. fl = ht.xpath("//div[@class='dd_lm']/a/text()")
  16. lj = ht.xpath("//div[@class='dd_bt']/a/@href")
  17. # 链接有两种格式,分别组合成可以用的
  18. for j in lj:
  19. if j[:5] == '//www':
  20. lj1.append('https:' + j)
  21. else:
  22. lj1.append('https://www.chinanews.com.cn/' + j)
  23. n = 0 # 这是匹配文章和分类
  24. for k in tqdm(lj1):
  25. try:
  26. data = []
  27. # 发起请求
  28. reqs = requests.get(k, headers=headers, timeout=10)
  29. reqs.encoding = 'utf8'
  30. ht1 = etree.HTML(reqs.text)
  31. # 因为这网站的正文所在的xpath路径不同,现在就是拿两种路径下的文本
  32. bt = ht1.xpath("//h1[@class='content_left_title']/text()") # 标题
  33. if bt: # 判断标题是不是为空,不为空就走第一种xpath
  34. data.append([fl[n]]) # 爬到第几个链接就把第几个的类别放进来
  35. data.append(ht1.xpath("//h1[@class='content_left_title']/text()")) # 标题
  36. data.append(ht1.xpath("//div[@class='left_zw']/p/text()")) # 简介
  37. data.append([lj1[n]]) # 文章的链接
  38. else:
  39. data.append([fl[n]])
  40. data.append(ht1.xpath("//div[@class='content_title']/div[@class='title']/text()"))
  41. data.append(ht1.xpath("//div[@class='content_desc']/p/text()")) # 简介
  42. data.append([lj1[n]])
  43. # 数据写入
  44. for y in range(len(data)):
  45. sheet.cell(x, y + 1).value = '\n'.join(data[y])
  46. x += 1
  47. n += 1
  48. except Exception as arr:
  49. m.write(lj1[n])
  50. continue
  51. # 保存
  52. l.save(r'D:\工作文件\cnew_data.xlsx')
  53. f.close()
  54. m.close()

主函数

  1. if __name__ == '__main__':
  2. # cnew_url()
  3. cnew_data()

完整代码

少了一下注释,详细可看前面

  1. import openpyxl
  2. import requests
  3. from lxml import etree
  4. from tqdm import tqdm
  5. headers = {
  6. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
  7. }
  8. # 组合日期链接
  9. def cnew_url():
  10. f = open(r'D:/工作文件/cnew_url.txt', 'w', encoding='utf8')
  11. for i in range(1, 6):
  12. if i < 10:
  13. url = 'https://www.chinanews.com.cn/scroll-news/2023/020' + str(i) + '/news.shtml'
  14. else:
  15. url = 'https://www.chinanews.com.cn/scroll-news/2023/02' + str(i) + '/news.shtml'
  16. f.write(url + '\n')
  17. f.close()
  18. def cnew_data():
  19. f = open(r'D:/工作文件/cnew_url.txt', encoding='utf8') # 读取上面已经组合好的链接
  20. l = openpyxl.load_workbook(r'D:\工作文件\cnew_data.xlsx')
  21. sheet = l.active
  22. m = open(r'D:/工作文件/cnew_url1.txt', 'a', encoding='utf8') # 保存报错的链接
  23. x = 1 # 从Excel的第几行开始写入
  24. for i in f:
  25. lj1 = []
  26. # 发起请求,获取页面里面的新闻链接
  27. req = requests.get(i.replace('\n', ''), headers=headers)
  28. # 设置网页编码,不设置会乱码
  29. req.encoding = 'utf8'
  30. ht = etree.HTML(req.text)
  31. # 获取分类的数据还有正文链接
  32. fl = ht.xpath("//div[@class='dd_lm']/a/text()")
  33. lj = ht.xpath("//div[@class='dd_bt']/a/@href")
  34. # 链接有两种格式,分别组合成可以用的
  35. for j in lj:
  36. if j[:5] == '//www':
  37. lj1.append('https:' + j)
  38. else:
  39. lj1.append('https://www.chinanews.com.cn/' + j)
  40. n = 0
  41. for k in tqdm(lj1):
  42. try:
  43. data = []
  44. reqs = requests.get(k, headers=headers, timeout=10)
  45. reqs.encoding = 'utf8'
  46. ht1 = etree.HTML(reqs.text)
  47. bt = ht1.xpath("//h1[@class='content_left_title']/text()") # 标题
  48. if bt:
  49. data.append([fl[n]])
  50. data.append(ht1.xpath("//h1[@class='content_left_title']/text()")) # 标题
  51. data.append(ht1.xpath("//div[@class='left_zw']/p/text()")) # 简介
  52. data.append([lj1[n]])
  53. else:
  54. data.append([fl[n]])
  55. data.append(ht1.xpath("//div[@class='content_title']/div[@class='title']/text()"))
  56. data.append(ht1.xpath("//div[@class='content_desc']/p/text()")) # 简介
  57. data.append([lj1[n]])
  58. for y in range(len(data)):
  59. sheet.cell(x, y + 1).value = '\n'.join(data[y])
  60. x += 1
  61. n += 1
  62. except Exception as arr:
  63. m.write(lj1[n])
  64. continue
  65. l.save(r'D:\工作文件\cnew_data.xlsx')
  66. f.close()
  67. m.close()
  68. if __name__ == '__main__':
  69. # cnew_url()
  70. cnew_data()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/599504
推荐阅读
相关标签
  

闽ICP备14008679号