# -*- coding: utf-8 -*-
import os
import sys
import requests
import re
from lxml import etree
"""
抓取网易新闻的爬虫
"""
# 存储爬取到的结果
def StringListSave(save_path, filename, slist):
if not os.path.exists(save_path):
os.makedirs(save_path)
path = save_path + "/" + filename + ".txt"
with open(path, "w+") as fp:
for s in slist:
fp.write("%s\t\t%s\n" % (s[0].encode("utf8"), s[1].encode("utf8")))
# 找出分类模块
def Page_Info(myPage):
'''Regex'''
# 使用正则表达式进行匹配,findall(pattern,string,flags)方法为返回string中所有与pattern相匹配的全部字串,返回形式为数组
# re.S为将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配
mypage_Info = re.findall(
r'(.*?)
', myPage,
re.S)
print('正则表达式匹配之后的结果为:')
for result in mypage_Info:
print('result:', result)
return mypage_Info
# 使用Xpath来分析二级页面
def New_Page_Info(new_page):
dom = etree.HTML(new_page)
# 使用Xpath的相对路径,查找所有tr/td/标签下的a标签内容。
new_items = dom.xpath('//tr/td/a/text()')
new_urls = dom.xpath('//tr/td/a/@href')
# 使用断言进行判断是否相等
assert (len(new_items) == len(new_urls))
# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
return zip(new_items, new_urls)
# 爬虫的主要方法
def Spider(url):
i = 0
print('downloading:',url)
# 使用requests请求要爬取的链接
myPage = requests.get(url).content.decode("gbk")
# myPage = urllib2.urlopen(url).read().decode("gbk")
myPageResults = Page_Info(myPage)
# 以u或U开头的字符串表示unicode字符串
save_path = u"网易新闻抓取"
filename = str(i) + "_" + u"新闻排行榜"
StringListSave(save_path, filename, myPageResults)
i += 1
for item, url in myPageResults:
print("downloading ", url)
new_page = requests.get(url).content.decode("gbk")
# new_page = urllib2.urlopen(url).read().decode("gbk")
newPageResults = New_Page_Info(new_page)
filename = str(i) + "_" + item
StringListSave(save_path, filename, newPageResults)
i += 1
# main方法入口
if __name__ == '__main__':
print("start")
# 需要爬取的网站
start_url = "http://news.163.com/rank/"
Spider(start_url)
print("end")
生成可执行文件的方法:
pip install pyinstaller
pyinstaller -F NewsSpider.py
总结:
1.使用requests进行爬取。
2.r开头的字符串表示正则表达式
3.u开头的字符串表示unicode编码
4.re.findall方法参数分别是pattern,string,tags,表示string字符串中所有与pattern相匹配的“全部”字符串。re.S表示全部字符串包括\n。
5.Xpath可以使用绝对路径,/html/body/....,也可以使用相对路径//li/a
6.Xpath中//li/a/text()表示所有的li标签下的a元素的文本
7.Xpath中//li/a/@href表示所有的li标签下的a元素的href
8.assert方法表示断言,表示判断是否相等
9.zip方法表示将对应元素打包成元组。