本帖最后由 PhilipZyy5012 于 2019-1-12 22:18 编辑
【故事背景】我是一个贫穷的学生,所以一般不开各大影视平台的VIP,想看最近的电影电视剧一般都是去公众号找资源的,最近我发现了一个公众号,他资源更新的还是挺快的,而且基本都是1080P画质以上的。
有我就在想我每次都要去搜索相应的片名,然后再去他的公众号对话窗口回复电影名,然后他给你一个超链接跳转到相应的页面,这样就比较繁琐,于是我就想着写一个爬虫来爬取他公众号对接的网页上的电影资源分享链接。
代码给在下面了。
【说明】
为了避免涉嫌推广,我已经将该公众号对接的url去掉了。在这里仅做爬虫代码分享,该写的注释我已经写了。由于我也只是一个初学Python的菜鸟,所以也是看了很多教程依葫芦画瓢写出来的东西。
由于我在学校学的语言是C#,做winform窗体比较方便,所以一直想用winform写个窗体然后调用这个python爬虫脚本,但是目前看来好像还是挺麻烦的。c#写爬虫我也还没怎么学,所以只能先这样子。
这次仅做初学者的技术分享,未来可能会做一个winform界面,方便大家直接爬取资源。
【协和研究所】这是我和我的小伙伴的团队名称
[Python] 纯文本查看 复制代码 import os.path
import openpyxl
import sys
import lxml
import re
import time
from webspider import WebSpider as w
if os.path.exists('电影资源爬取结果.xlsx'):
print('爬取结果已存在,如需重新爬取,请手动删除旧文件并重新运行本程序!')
sys.exit()
else:
#创建结果表格并初始化
excel = openpyxl.Workbook()
ws = excel.active
ws.title = 'result'
ws['A1'] = '电影名'
ws['B1'] = '下载链接'
row = 1
url = 'http://????.cn/'
spider = w(url)
is_last_page = False
page = 0
while not is_last_page:
page+=1
print('正在下载第%d页...'%page)
html = spider.download_html(url)
#提取电影名和下载链接
for each in spider.selector(html,'div[class*="homeposte"]'):
row += 1
ws['A%d'%row] = each.cssselect('h2 a')[0].text
ws['B%d'%row] = each.cssselect('p')[0].text
for each in spider.selector(html,'nav[class*="pagination"] a'):
is_last_page = True
if (each.text == '下一页 »'):
is_last_page = False
#提取下一页的链接,真的忘了css选择器表示该怎么写了
url = str(re.search(r'"(.+)"',lxml.html.tostring(each,encoding="Unicode")).group(1))
print('成功下载完第%d页!'%page)
#time.sleep(可适当设置拖延时间)
print('\n\n全部下载完成!^_^')
print('\n\nPowered By 协和研究所')
excel.save('电影资源爬取结果.xlsx') #将爬取结果命名并保存
[Python] 纯文本查看 复制代码 #Scape_v2.0版
# ---powered by 协和研究所
import requests
import time
import lxml.html
class WebSpider(object):
"""网络爬虫类"""
def __init__(self,url):
self.url = url #爬取的网址
def download_html(self,html_url = None,num_tries = 2,encoding = None):
#下载网页源码,默认下载self.url网址中的内容
if not html_url:
html_url = self.url
response = requests.get(html_url)
url_code = response.status_code
while(url_code != requests.codes.ok and num_tries > 0):
#处理网页响应出错
if (url_code >= 500 and url_code < 600):
#当为服务端出错时,重请求直至成功或尝试次数用完为止
num_tries -= 1
response = requests.get(html_url)
url_code = response.status_code
else:
#其他错误则引发HTTPError错误
raise(requests.exceptions.HTTPError)
if response.status_code == requests.codes.ok:
#判断网页响应是否成功
if (not encoding):
#默认编码为requests自动判断的结果
html = response.text
else:
#若制定了编码格式,则采用该编码格式就行解码
response.encoding = encoding
html = response.text
else:
html = None
return html
def selector(self,html,css_expression):
#根据表达式提取html页面中的信息
if css_expression:
tree = lxml.html.fromstring(html)
return tree.cssselect(css_expression)
|