Python爬虫学习:案例-所有版面列表抓取(3)

1. 观察页面存在二级目录

在这里插入图片描述
在这里插入图片描述
由此编写判断条件

#判断是否为二级目录
if len(columns[1].xpath('a')) == 0:
    url = self.domain + board['url']
    r = requests.get(url, headers=self.headers)
    children_boards = self.get_board_list(r.text)
    boards += children_boards  

2. 代码实现

import requests
import re
from lxml import etree

class BoardListCrawler:
    headers = {
        'Accept': "*/*",
        'Accept-Encoding': "gzip, deflate",
        'Accept-Language': "zh-CN,zh;q=0.9",
        'Connection': "keep-alive",
        'Host': "www.newsmth.net",
        'Referer': "http://www.newsmth.net/nForum/",
        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36",
        'X-Requested-With': "XMLHttpRequest",
        'cache-control': "no-cache",
    }

    domain = "https://www.newsmth.net"
    base_url = domain + "/nForum/section/{}?ajax"

    def get_content(self,page_number):
        #format函数参考:https://blog.csdn.net/nanhuaibeian/article/details/86591202
        url = self.base_url.format(page_number)
        response = requests.get(url,headers= self.headers)
        return response.text

    def get_board_list(self,content):
        boards = []
        tree = etree.HTML(content)
        rows = tree.xpath("//table[@class='board-list corner']/tbody/tr")
        # print(rows[0])
        for row in rows:
            board = {}
            columns = row.xpath('td')
            board['url'] = columns[0].xpath('a')[0].attrib['href']
            board['title'] = columns[0].xpath('a')[0].text
            #判断是否为二级目录
            if len(columns[1].xpath('a')) == 0:
                url = self.domain + board['url']
                r = requests.get(url,headers = self.headers)
                children_boards = self.get_board_list(r.text)
                boards += children_boards

            board['num_topics'] = columns[5].text
            board['num_posts'] = columns[6].text
            boards.append(board)
        return boards

if __name__ =='__main__':
    blc = BoardListCrawler()
    #版面是0-9
    for i in range(0,10):
        c = blc.get_content(i)
        boards = blc.get_board_list(c)
        print(boards)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值