用Python爬取更加有价值的文章

前言 在了解了python的语法之后,我就开始尝试写第一个爬虫,并且在网上也找了很多教程,发现有几个模块在Python爬取网页时,特别常用,例如:BeautfulSoup,Requests, csv, re。BeautfulSoup是一个方便解析html的模块,具体使用可以看Beautiful Soup 4.2.0 中文文档。Requests是一个模拟发送请求的模块,具体使用可看Requests
摘要由CSDN通过智能技术生成

前言

在了解了python的语法之后,我就开始尝试写第一个爬虫,并且在网上也找了很多教程,发现有几个模块在Python爬取网页时,特别常用,例如:BeautfulSoup,Requests, csv, reBeautfulSoup是一个方便解析html的模块,具体使用可以看Beautiful Soup 4.2.0 中文文档Requests是一个模拟发送请求的模块,具体使用可看Requests的开发接口。关于后两个是Python自带的模块,cvs的作用是数据的储存,一般是.cvs文件,rePython中的正则表达式模块,一般用于对数据的再处理,两者的具体使用可看The Python Standard Library

网页爬虫流程

在了解了爬虫需要的模块后,我们就来学习一下,做一个简单的网页爬虫的流程一般是什么:

在这里我们的小程序的流程基本上是一致的。

爬虫

至于爬什么网站,我选择了爬取简书,你也可以选取其他一些网站,像知乎豆瓣等等。在简书中有个模块是@IT·互联网,我们就选择它了,在它之中有个“热门”选项,我们就来爬取它其中的内容,获取热门文章的“题目”,“阅读人数”,“链接地址”,“评论条数”,“喜欢人数”,“打赏人数”,这样我们就可以通过文章的“阅读人数”,“评论条数”,“喜欢人数”,“打赏人数”选择排序,选择更加有价值的文章阅读。

打开“开发者工具”,在“network”下会点击“热门”,第一个里面就包含请求的url地址http://www.jianshu.com/c/V2CqjW?order_by=top

清空network中的信息,我们再滑动滚动条,因为是ajax请求,所以我们会在XHR选项发现一个带有参数的url地址http://www.jianshu.com/c/V2CqjW?order_by=top&page=2,后面的page=2就是我们需要自己设置的,可以让它递增,获取更多内容。

接下来我们因为需要用BeautfulSoup的通过css样式获取html的方法,所以我们需要找到定位的位置,获取它的css样式。这时我们需要打开Elements选项卡,获取到查询信息的css样式,其中每个li标签都是一篇文章。

接下来我们就来编写程序了,编写顺序可按照以下步骤进行:

  1. 建存储文件
  2. 设置正则表达式(只要数字)
  3. 提供url地址
  4. 设置css选择器
  5. 发请求,解析html
  6. 得到特定信息
  7. 写入文件
  8. 关闭文件

具体代码如下:

from tinydb import TinyDB
import csv

#建存储文件
db = TinyDB('collection_cxy_hot2.json')
csvfile = open("cxy_hot2.csv", "w", encoding='utf-8') 

fieldnames = ["title", "href", "people", "commmit", "like", "money"]#设置表头
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()

import requests
from bs4 import BeautifulSoup
import re
reg = re.compile('(\d+)')#设置正则表达式,只要数字

#提供url地址
base_url = "http://www.jianshu.com"
hot_url="http://www.jianshu.com/c/V2CqjW?order_by=top&page=%d"
add_url=1

#设置css选择器
title_selector = "#list-container .title"
people_selector = "div[class='meta'] > a"
commit_selector = "div[class='meta'] > a"
like_selector = "div[class='meta'] > span"
money_selector = "div[class='meta'] > span"

while(add_url < 300):
    try:
        #发请求,解析html
        first_page = requests.request('get', hot_url% add_url).content
        soup = BeautifulSoup(first_page, "lxml")

        #得到特定信息
        collection_total = [i.get_text() for i in soup.select(title_selector)]
        if not collection_total : break#没信息时,break
        print(collection_total)
        collection_href = [(base_url+i.get('href')) for i in soup.select(title_selector)]
        collection_pepele = [int(reg.findall(i.get_text())[0]) for i in soup.select(people_selector)][::2]#获取奇数项
        collection_commit = [int(reg.findall(i.get_text())[0]) for i in soup.select(commit_selector)][1::2]#获取偶数项
        collection_like = [int(reg.findall(i.get_text())[0]) for i in soup.select(like_selector)][::2]
        collection_money = [int(reg.findall(i.get_text())[0]) for i in soup.select(money_selector)][1::2]

        for c,d,e,f,g,h in zip(collection_total, collection_href, collection_pepele, collection_commit, collection_like, collection_money):
            collection_dict = {"title":c, "href":d, "people":e, "commmit":f, "like":g, "money":h}
            #写入文件
            db.insert(collection_dict)
            writer.writerow(collection_dict)
        add_url += 1#爬下一页
    except Exception as t:
        print(t)
        break
csvfile.close()#关闭文件

然后执行爬虫,验证结果,结果正确。

得到的.csv文件可能用Excel打开会乱码,所以在这里提供一个可以将.json文件转为格式良好的.csv文件的网站:JSON to CSV Converter Online,把.json文件传上去,下载下来即可。


我们打开下载文件,就可以通过“阅读人数”,“评论条数”,“喜欢人数”,“打赏人数”选择排序,选择更加有价值的文章阅读了。

至此一个简单的爬虫小程序就完成了。

后续

因为这是我的第一个爬虫程序,代码之中难免会有些选取规则不合适或命名不规范,希望大家能够多多包涵,多多指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值