爬取Discuz!社区的教程标题

爬取Discuz!社区的教程标题-史上最详细解析(实现分页)

摘要:本文记录了爬取Discuz!社区的教程标题的详细过程,过程清晰

  • 这是O的第一篇博客,如有排版问题请大佬见谅,O非常希望大佬能在评论区给出宝贵的意见共同进步
  • 经过千辛万苦终于实现了自己的第一个爬虫,以此纪念一下

总代码

import requests
from lxml import etree
class Disspider:
    #获取头部及开始url
    def __init__(self):
        self.start_url = "https://www.discuz.net/portal.php?mod=list&catid=8&page={}"
        self.headers = {"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Mobile Safari/537.36"}
    #构建url列表
    def get_url_list(self):
        url_list=[]
        for i in range(19):
            url_list.append(self.start_url.format(i+1))
        return url_list
    #获取所需要的信息
    def spider_information(self,url):
        resp = requests.get(url,headers=self.headers).content
        html=etree.HTML(resp)
        result=html.xpath('//p[@class="wz_tits"]/text()')
        return result
    #保存数据
    def save(self,result):
        #'a'表示循环写入不覆盖之前写的内容
        with open('text.txt','a',encoding='utf-8') as f:
            #此时result为列表,write函数只能接收字符串类型的数据
            for i in result:
                f.write("\n"+i)
    #主逻辑函数
    def run(self):
        url_list=self.get_url_list()
        for url in url_list:
            result=self.spider_information(url)
            self.save(result)
if __name__ == '__main__':
    disspider=Disspider()
    disspider.run()

分函数解析

从上至下数的第一个函数:

#self作用类似于指针
def __init__(self):
        #self.start_url表示起始url地址(即第一页地址),因为要实现分页所以page后是大括号不写死,留给构建url_list列表函数来填充page
        self.start_url = "https://www.discuz.net/portal.php?mod=list&catid=8&page={}"
        #写self.headers主要是为了模拟浏览器欺骗服务器,获取和浏览器一致的内容
        #如果需要也可以加cookie来帮忙反反爬,不过此处不需要,当然因为cookie往往和一个用户对应,请求太快,容易被服务器识别为爬虫,故不需要cookie时                              
        #尽量不要用cookie
        self.headers = {"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Mobile Safari/537.36"}

第二个函数:

 #构建url列表
    def get_url_list(self):
        url_list=[]
        #Discuz!社区的教程我写这个爬虫时是一个19页,故直接用for循环来构建url_list列表
        for i in range(19):
            #字符串的format方法,实现格式化,基本语法是通过 {} 和 : 来代替以前的 %,
            url_list.append(self.start_url.format(i+1))
        #这时在第一个函数写的start_url中的{}以被填充完毕,形成了19页对应的19个url写入url_list列表中,再return
        return url_list

第三个函数:

 #获取所需要的信息
    def spider_information(self,url):
        #获取响应内容,resp.content返回的字节流数据
        resp = requests.get(url,headers=self.headers).content
        #此为lxml的etree用法,能更好的发挥xpath的作用
        html=etree.HTML(resp)
        #这个xpath路径为标题路径,如果需要爬取其他东西例如发布时间等直接替换xpath路径就好
        result=html.xpath('//p[@class="wz_tits"]/text()')
        return result

第四个函数:

#保存数据
    def save(self,result):
        #'a'表示循环写入不覆盖之前写的内容
        with open('text.txt','a',encoding='utf-8') as f:
            #此时result为列表,write函数只能接收字符串类型的数据
            for i in result:
                #为了输出在不同的行上在前面加上换行符,方便阅读
                f.write("\n"+i)

第五个函数:

#主逻辑函数,实现之前的函数调用,类似于c语言的main函数
    def run(self):
        #构建url_list列表
        url_list=self.get_url_list()
        #取出url_list列表里的每一个url进行下一步操作
        for url in url_list:
            #获取想要的数据
            result=self.spider_information(url)
            #保存
            self.save(result)

第六个函数:

#主要功能是让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行
if __name__ == '__main__':
    #该语句O理解为
    disspider=Disspider()
    disspider.run()

fighting!,一起成长(^^)

posted @ 2020-06-13 16:46  Oten  阅读(576)  评论(0)    收藏  举报