写在前面:
最近自学了一下python爬虫,用来简单爬取论坛的数据,只学到了一些皮毛,毕竟还是要以实用为主嘛…学会了下面的代码,就可以爬取一些网站的数据了,这里我使用xpath库进行爬取,问我为什么不用正则?因为我还不是很会用,哈哈。

1.环境准备

1.pycharm开发工具
2.python3.8
3.xpath helper
4.有手就行

2.分析需要爬取的网站

http://hongdou.gxnews/viewforum-21.html

通过观察可以发现,我们想要数据都在【div class=“threadbit1”】里面


第一页是【http://hongdou.gxnews/viewforum-21-1.html】
第二页是【http://hongdou.gxnews/viewforum-21-2.html】
最后一页是【http://hongdou.gxnews/viewforum-21-73.html】

从中我们可以找到翻页的规律,就是+1

3.获取URL和请求头


4.编写代码

import requests
import time
from lxml import etree
#url
url='http://hongdou.gxnews/viewforum-21-%d.html'
#请求头
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}
if __name__ == '__main__':
    #写入
    fp = open('./hongdou.csv','w',encoding='utf-8')
    #获取多页数据
    for i in range(74):
        s_url=url%(i+1)
        res = requests.get(s_url,headers=headers) #发起请求
        res.encoding='gbk' #设置编码格式
        text = res.text
        html = etree.HTML(text)
        items = html.xpath('//div[@class="threadbit1"]')
        # print(res.status_code)
        for item in items:
            title=item.xpath('.//div[@class="thread-row openTitle"]/a/font/text()'),
            yeshu=item.xpath('.//span[@class="threadpages"]/text()'),
            author=item.xpath('.//div[@style="float:right;width:80px;line-height:16px;"]/a[1]/text()'),
            fa_time = item.xpath('.//div[@style="float:right;width:80px;line-height:16px;"]/a[2]/text()'),
            lend_author=item.xpath('.//div[@style="float:right;width:100px;line-height:16px;"]/a[1]/text()'),
            lend_time = item.xpath('.//div[@style="float:right;width:100px;line-height:16px;"]/a[2]/text()');
            # print(title,yeshu,author,fa_time,lend_author,lend_time)
            fp.write('%s\t%s\t%s\t%s\t%s\t%s\n'%(title,yeshu,author,fa_time,lend_author,lend_time))
        print('第%d页爬取成功'%(i+1))
        time.sleep(1)
    fp.close()

5.代码解释

  1. 在获取的url地址中使用%d占位符,为后面爬取多页数据做准备。
  2. print(res.status_code) 前期可以打印一下状态码,看请求成不成功。
  3. time.sleep(1),一秒钟爬取一次,保守起见,不要给别人服务器造成太大压力,如果一直频繁请求你可能会被拉入黑名单。
  4. 我发现这个网页的编码格式是GBK,但是大部分的网站编码格式都是utf-8
  5. fp = open('./hongdou.csv','w',encoding='utf-8') 想要保存成txt格式都可以咯,为什么这里编码是utf-8,这是反复测试的结果,不然保存会乱码,就是那么奇怪。
  6. s_url=url%(i+1)如果像是翻一页+20,括号里也可以写成(i*20),但是range里面就需要相应的改变了,比如 2X20=40,3X20=60…

6.xpath

使用xpath helper帮助我们更加精准的获取到想要的数据。当然,代码不是唯一的,你怎么开心怎么来,写着写着发现变黄了就说明你找到了,运行一下代码看找到想要的数据就得了呗。

以获取标题为例:

title=item.xpath('.//div[@class="thread-row openTitle"]/a/font/text()'),

前面加个点代表当前路径下,后面加个/text(),不加就获取不到。如果增加下面的.strip()去除两边空格的方法,我有时候会报错,所以我干脆就不用了

title=item.xpath('.//div[@class="thread-row openTitle"]/a/font/text()')[0].strip(),

获取完了可以打印一下看对不对:

print(title);

7.xpath helper

要在谷歌浏览器里用,别的浏览器我没用过。
安装包在这:https://pan.baidu/s/1vAz-wIdsJ5EaX1hp37St4g提取码【8a2h】
解压安装包——浏览器中打开右上角三个点——选择更多工具——扩展程序——加载已解压的扩展程序


重启一下浏览器,发现右上角多了个X标就得了;在网页中按快捷键Ctrl+Shift+X就可以打开使用了

更多推荐

python爬虫——30行代码爬取论坛数据