好段子网站任意页数爬取

#使用Xpath方式爬取好段子
#http://www.haoduanzi.com/category/?1-1.html 从第二页开始1-2 1-3

import urllib.parse
import urllib.request
from lxml import etree
import time
import json

#写个列表 parse_content方法中使用
item_list = []

#构建请求函数
def handle_request(url,page):
    #构造请求头
    headers = {
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
    #注意 拼接url  新姿势
    url = url % page
    #print(url)
    request = urllib.request.Request(url=url,headers=headers)
    return request

#定义解析服务器返回内容的函数
def parse_content(content):
    #生成对象
    tree = etree.HTML(content)
    #注意此处有一个重点是
    # <li>标签中有不含属性的,有含属性的,要过滤不含属性的 li[not(@class)]
    #注意:
    #双斜杠//代表下面所有位置的标签
    #.//代表当前块内的标签寻找
    div_list = tree.xpath('//div[@class="left"]/ul[@class="list-box"]/li[not(@class)]')
    # print(len(div_list))
    # exit()
    #循环li列表
    for odiv in div_list:
        #获取标题
        title = odiv.xpath('.//h2[@class="s2"]/text()')
        # print(title)
        # exit()
        #内容
        text_lt = odiv.xpath('.//div[@class="content"]/a/p/text()')
        text = '\n'.join(text_lt)
        # print(text)
        # print(len(text))
        # print("*"*60)
        # exit()
        item ={
            '标题':title,
            '内容':text
        }
        #将内容写入到列表中
        item_list.append(item)
#主函数
def main():
    start_page = int(input("请输入想要开始爬取的页数(从第2页开始):"))
    end_page = int(input("请输入想要结束的页数:"))
    url = "http://www.haoduanzi.com/category/?1-%s.html"
    for page in range(start_page,end_page +1):
        print("开始爬取第%s页"% page)
        #构建请求
        request = handle_request(url,page)
        content = urllib.request.urlopen(request).read().decode()
        #print(content)
        parse_content(content)
        time.sleep(2)
        #写入到文件中
        #string = json.dumps(item_list,ensure_ascii=False)
        #此处输出为一个大字典
        with open("duanzi.html","w",encoding="utf8") as fp:
            fp.write(str(item_list))
        print("第%s页爬取结束"% page)
    print("爬取任务结束.....")

if __name__== '__main__':
    main()

 

 

posted @ 2020-01-12 15:48  求知鱼  阅读(310)  评论(0编辑  收藏  举报