项目实战-百思不得姐页面爬取

2018-05-12  本文已影响42人  部落大圣

完整代码

# coding:utf-8

import requests
from lxml import etree
import xlwt


class budejieData(object):
    """
    初始化变量,创建工作薄,表单,表头
    """
    def __init__(self):
        self.count = 1  # 定义全局变量
        self.f = xlwt.Workbook()  # 创建工作薄
        self.sheet1 = self.f.add_sheet(u'任务列表', cell_overwrite_ok=True)
        self.rowTitle = [u'编号', u'作者', u'段子', u'图片']
        for i in range(0, len(self.rowTitle)):
            self.sheet1.write(0, i, self.rowTitle[i])
        self.f.save('budejie.xlsx')
    """
    页面循环函数
    """
    def getUrl(self):
        for i in range(5):
            url = 'http://www.budejie.com/{}'.format(i+1)
            self.spiderPage(url)

    """
    爬取页面函数
    """
    def spiderPage(self, url):
        if url is None:  # 判断链接是否为空
            return None
        try:
            proxies = {
                'http': 'http://125.46.0.62:53281',  # 代理IP地址防止被封
            }
            user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/' \
                         '51.0.2704.106 Safari/537.36'  # 模拟浏览器访问
            headers = {'User_Agent': user_agent}
            response = requests.get(url, proxies=proxies, headers=headers).text
            select = etree.HTML(response)
            trs = select.xpath('/html/body/div[2]/div/div[2]/div[1]/div[2]/ul/li')  # 提取tr之前的节点集合
            """
            遍历trs 逐条抓取数据
            """
            for tr in trs:
                data = []
                author = tr.xpath('./div[1]/div[2]/a/text()')
                title = tr.xpath('./div[2]/div[1]/a/text()')
                img = tr.xpath('./div[2]/div[2]/a/img/@src')
                author = author[0] if len(author) > 0 else ''
                title = title[0] if len(title) > 0 else ''
                img = img[0] if len(img) > 0 else''
                print author, title, img
                """
                拼成一个集合
                """
                data.append(self.count)  # 插入编号
                data.append(author)  # 插入作者
                data.append(title)  # 插入内容
                data.append(img)  # 插入图片
                self.count += 1  # 增加记录行数
                for i in range(len(data)):
                    self.sheet1.write(data[0], i, data[i])
                self.f.save('budejie.xlsx')

        except Exception, e:
            print '出错', e.message
"""
实例化,执行函数
"""

if '_main_':
    Job = budejieData()
    Job.getUrl()
百思不得姐

问题总结

这次 实战是对寒大佬的套路第三次运用,这次倒是写的挺溜,一个小时搞定。自以为很简单,结果打印不出结果,抱着疑问去睡觉。早上打印链接才发现问题

 for i in range(5):
            url = 'http://www.budejie.com/i'.format(i+1)

打印结果都是

http://www.budejie.com/i

修改

 for i in range(5):
            url = 'http://www.budejie.com/{}'.format(i+1)

正确打印

今天还有发现,除了错误的缩减会导致代码错误。还有未来代码的美观遵从PEP8协议。函数与函数直接空行不要太多。
再次感谢@逆水寒大佬你的套路真好用。

上一篇下一篇

猜你喜欢

热点阅读