完整代码
# 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协议。函数与函数直接空行不要太多。
再次感谢@逆水寒大佬你的套路真好用。
网友评论