04-python简单爬虫_爬取网易新闻

# -*- 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'<div class="titleBar" id=".*?"><h2>(.*?)</h2><div class="more"><a href="(.*?)">.*?</a></div></div>', 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方法表示将对应元素打包成元组。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会编程的阿强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值