精华内容
下载资源
问答
  • Python爬虫案例

    万人学习 2019-09-15 16:11:56
    Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例
  • python爬虫案例

    千次阅读 2019-06-13 09:52:33
    今天为大家整理了32个Python爬虫项目。 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的...

    今天为大家整理了32个Python爬虫项目。
    整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O

    WechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。

    DouBanSpider [2]- 豆瓣读书爬虫。可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍;可依据不同的主题存储到Excel不同的Sheet ,采用User Agent伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。

    zhihu_spider [3]- 知乎爬虫。此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo

    bilibili-user [4]- Bilibili用户爬虫。总数据数:20119918,抓取字段:用户id,昵称,性别,头像,等级,经验值,粉丝数,生日,地址,注册时间,签名,等级与经验值等。抓取之后生成B站用户数据报告。

    SinaSpider [5]- 新浪微博爬虫。主要爬取新浪微博用户的个人信息、微博信息、粉丝和关注。代码获取新浪微博Cookie进行登录,可通过多账号登录来防止新浪的反扒。主要使用 scrapy 爬虫框架。

    distribute_crawler [6]- 小说下载分布式爬虫。使用scrapy,Redis, MongoDB,graphite实现的一个分布式网络爬虫,底层存储MongoDB集群,分布式使用Redis实现,爬虫状态显示使用graphite实现,主要针对一个小说站点。

    CnkiSpider [7]- 中国知网爬虫。设置检索条件后,执行src/CnkiSpider.py抓取数据,抓取数据存储在/data目录下,每个数据文件的第一行为字段名称。

    LianJiaSpider [8]- 链家网爬虫。爬取北京地区链家历年二手房成交记录。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。

    scrapy_jingdong [9]- 京东爬虫。基于scrapy的京东网站爬虫,保存格式为csv。

    QQ-Groups-Spider [10]- QQ 群爬虫。批量抓取 QQ 群信息,包括群名称、群号、群人数、群主、群简介等内容,最终生成 XLS(X) / CSV 结果文件。

    wooyun_public[11]-乌云爬虫。 乌云公开漏洞、知识库爬虫和搜索。全部公开漏洞的列表和每个漏洞的文本内容存在MongoDB中,大概约2G内容;如果整站爬全部文本和图片作为离线查询,大概需要10G空间、2小时(10M电信带宽);爬取全部知识库,总共约500M空间。漏洞搜索使用了Flask作为web server,bootstrap作为前端。

    spider[12]- hao123网站爬虫。以hao123为入口页面,滚动爬取外链,收集网址,并记录网址上的内链和外链数目,记录title等信息,windows7 32位上测试,目前每24个小时,可收集数据为10万左右

    findtrip [13]- 机票爬虫(去哪儿和携程网)。Findtrip是一个基于Scrapy的机票爬虫,目前整合了国内两大机票网站(去哪儿 + 携程)。

    163spider [14] - 基于requests、MySQLdb、torndb的网易客户端内容爬虫

    doubanspiders[15]- 豆瓣电影、书籍、小组、相册、东西等爬虫集 writen by Python

    QQSpider [16]- QQ空间爬虫,包括日志、说说、个人信息等,一天可抓取 400 万条数据。

    baidu-music-spider [17]- 百度mp3全站爬虫,使用redis支持断点续传。

    tbcrawler[18]- 淘宝和天猫的爬虫,可以根据搜索关键词,物品id来抓去页面的信息,数据存储在mongodb。

    stockholm [19]- 一个股票数据(沪深)爬虫和选股策略测试框架。根据选定的日期范围抓取所有沪深两市股票的行情数据。支持使用表达式定义选股策略。支持多线程处理。保存数据到JSON文件、CSV文件。

    BaiduyunSpider[20]-百度云盘爬虫。

    Spider[21]-社交数据爬虫。支持微博,知乎,豆瓣。

    proxy pool[22]-Python爬虫代理IP池(proxy pool)。

    music-163[23]-爬取网易云音乐所有歌曲的评论。

    jandan_spider[24]-爬取煎蛋妹纸图片。

    CnblogsSpider[25]-cnblogs列表页爬虫。

    spider_smooc[26]-爬取慕课网视频。

    CnkiSpider[27]-中国知网爬虫。

    knowsecSpider2[28]-知道创宇爬虫题目。

    aiss-spider[29]-爱丝APP图片爬虫。

    SinaSpider[30]-动态IP解决新浪的反爬虫机制,快速抓取内容。

    csdn-spider[31]-爬取CSDN上的博客文章。

    ProxySpider[32]-爬取西刺上的代理IP,并验证代理可用性

    展开全文
  • Python 爬虫案例 贴吧 内涵小段子 爬虫等案例 百度云网盘
  • 最简洁最易懂python爬虫案例,根据给定的网址来获取网页详细信息,得到的html就是网页的源代码。
  • python爬虫案例-聚焦爬虫的数据解析简述.pdf
  • python爬虫案例记录

    万次阅读 2020-10-19 00:31:49
    python爬虫案例 豆瓣电影排行 代码实例 import requests, json, pprint class DouBan: """豆瓣电影排行""" def __init__(self, start, limit): self.url = "https://movie.douban.com/j/chart/top_list" ...

    python爬虫案例

    1.豆瓣电影排行

    • 示例代码
    import requests, json, pprint
    
    
    class DouBan:
        """豆瓣电影排行"""
    
        def __init__(self, start, limit):
            self.url = "https://movie.douban.com/j/chart/top_list"
            self.headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
            }
            self.start = start
            self.limit = limit
            self.params = {
                "type": "11",
                "interval_id": "100:90",
                "action": "",
                "start": self.start,
                "limit": self.limit,
            }
            self.list = []
    
        def get_movies_dict(self):
            response = requests.get(url=self.url, headers=self.headers, params=self.params, verify=False)
            content = response.json()
            return content
    
        def run(self):
            contents = self.get_movies_dict()
    
            for content in contents:
                # print(content["title"])
                movice_dict = {}
                movice_dict["电影名"] = content["title"]
                movice_dict["连接"] = content["url"]
                movice_dict["评分"] = content["score"]
                # print(movice_dict)
                self.list.append(movice_dict)
    
            with open("./movie.txt", "w", encoding="utf8") as f:
                f.write(str(self.list))
    
           
    def main():
        start = input('您想从第几部电影开始获取: ')
        limit = input('您想获取多少电影数据: ')
        dp = DouBan(start, limit)
        dp.run()
    
    
    if __name__ == "__main__":
        main()
    
    • 运行结果
    [{'电影名': '霸王别姬', '连接': 'https://movie.douban.com/subject/1291546/', '评分': '9.6'}, {'电影名': '控方证人', '连接': 'https://movie.douban.com/subject/1296141/', '评分': '9.6'}, {'电影名': '伊丽莎白', '连接': 'https://movie.douban.com/subject/24877005/', '评分': '9.6'}, {'电影名': '阿甘正传', '连接': 'https://movie.douban.com/subject/1292720/', '评分': '9.5'}, {'电影名': '美丽人生', '连接': 'https://movie.douban.com/subject/1292063/', '评分': '9.5'}, {'电影名': '辛德勒的名单', '连接': 'https://movie.douban.com/subject/1295124/', '评分': '9.5'}, {'电影名': '茶馆', '连接': 'https://movie.douban.com/subject/1461403/', '评分': '9.5'}, {'电影名': '控方证人', '连接': 'https://movie.douban.com/subject/5294851/', '评分': '9.5'}, {'电影名': '十二怒汉(电视版)', '连接': 'https://movie.douban.com/subject/10583098/', '评分': '9.5'}, {'电影名': '这个杀手不太冷', '连接': 'https://movie.douban.com/subject/1295644/', '评分': '9.4'}, {'电影名': '千与千寻', '连接': 'https://movie.douban.com/subject/1291561/', '评分': '9.4'}, {'电影名': '泰坦尼克号', '连接': 'https://movie.douban.com/subject/1292722/', '评分': '9.4'}, {'电影名': '忠犬八公的故事', '连接': 'https://movie.douban.com/subject/3011091/', '评分': '9.4'}, {'电影名': '十二怒汉', '连接': 'https://movie.douban.com/subject/1293182/', '评分': '9.4'}, {'电影名': '泰坦尼克号 3D版', '连接': 'https://movie.douban.com/subject/5450891/', '评分': '9.4'}, {'电影名': '背靠背,脸对脸', '连接': 'https://movie.douban.com/subject/1307856/', '评分': '9.4'}, {'电影名': '灿烂人生', '连接': 'https://movie.douban.com/subject/1291831/', '评分': '9.4'}, {'电影名': '横空出世', '连接': 'https://movie.douban.com/subject/1464526/', '评分': '9.4'}, {'电影名': '遥望南方的童年', '连接': 'https://movie.douban.com/subject/3037329/', '评分': '9.4'}, {'电影名': '巴黎圣母院', '连接': 'https://movie.douban.com/subject/20326557/', '评分': '9.4'}]
    

    2.化妆品生产许可证信息爬取

    • 示例代码
    import requests, json
    import random
    import os
    from pprint import pprint
    
    
    class CompanyInfoDown:
        """化妆品生产许可证信息爬取"""
    
        def __init__(self, star_page=1, end_page=1, file_name="企业信息"):
            self.url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
            self.next_url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
            self.headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
            self.proxies_list = ["47.94.104.204:8118",
                                 "175.42.129.207:9999"]
            self.star_page = star_page
            self.end_page = end_page if end_page >= star_page else star_page
            self.data = {
                "on": "true",
                "page": str(self.star_page),
                "pageSize": "15",
                "productName": "",
                "conditionType": "1",
                "applyname": "",
                "applysn": "",
            }  # post的data参数
            self.counter = 0  # 计数器
            self.file_name = file_name
    
        def parse(self, url, data):
            """解析url"""
            proxies = {"http:": random.choice(self.proxies_list)}  # d代理
            response = requests.post(url=url, headers=self.headers, data=data, proxies=proxies)  # 请求
    
            if response.status_code == 200 and response.json():
                return response  # 返回字典
            else:
                return None
    
        def file_down(self, file_name, content: dict):
            """写入文件"""
            path = "./"
            title = self.file_name
            new_path = os.path.join(path, title)
            if not os.path.isdir(new_path):
                os.makedirs(new_path)
    
            for key, value in content.items():
                str = key + " : " + ("" if value is None else value) + "\n"
                with open(new_path + "/" + file_name + ".txt", "a") as  f:
                    f.write(str)
    
            self.counter += 1
    
        def processing_data(self, data: dict):
    
            _esp_name = data["EPS_NAME"]
            _id = data["ID"]
            new_data = {
                "id": _id
            }
            return _esp_name, _id, new_data
    
        def __del__(self):
            print("共计下载企业信息{}条".format(self.counter))
    
        def spider(self):
            print("开始页数: {0},结束页数: {1}".format(self.star_page, self.end_page))
            while True:
                response = self.parse(self.url, self.data)
                info_dict = response.json()   # 获取的json数据转为python 字典
                if info_dict:
                    for i in info_dict["list"]:
                        _data = self.processing_data(i)
                        new_response = self.parse(self.next_url, data=_data[2])
                        new_info_dict = new_response.json()  # print(_data[0],new_info_dict)
                        self.file_down(_data[0], new_info_dict)
                else:
                    print("——————没数据——————")
    
                # 结束循环
                if self.end_page < self.star_page:
                    print("下载完毕")
                    result=os.listdir("./"+self.file_name)
                    pprint(result)
                    break
                print("\r","正在下载第 {} 页……".format(self.star_page))
                self.star_page += 1
                self.data["page"] = str(self.star_page)
    
    
    def main():
        cid = CompanyInfoDown(1, 5, file_name="化妆品企业信息")
        cid.spider()
        del cid
    
    
    if __name__ == '__main__':
        main()
    
    
    • 运行结果
    开始页数: 1,结束页数: 5
     正在下载第 1 页……
     正在下载第 2 页……
     正在下载第 3 页……
     正在下载第 4 页……
     正在下载第 5 页……
    下载完毕
    ['上海延安药业(湖北)有限公司.txt',
     '中基惠诚科技有限公司.txt',
     '中山市小妆生物科技有限公司.txt',
     '中山市美太保健制品有限公司.txt',
     '中山爱护日用品有限公司.txt',
     '丹东市黄海化妆品厂.txt',
     '佛山市合越生物科技有限公司.txt',
     '佛山市百分之秀化妆品有限公司.txt',
     '内蒙古天驼生物科技有限公司.txt',
     '力汇(中国)生物科技有限公司.txt',
     '南京永丰皮肤药业技术开发有限公司.txt',
     '哈尔滨佰纳民生药业有限公司.txt',
     '国妆(广州)科技有限公司.txt',
     '大连双迪科技股份有限公司大连第一分公司.txt',
     '天津普兰娜天然植物化妆品集团有限公司.txt',
     '奇妙生物科技(广州)有限公司.txt',
     '完美(广东)日用品有限公司.txt',
     '宝爵生物科技(广州)有限公司.txt',
     '平顶山市聚隆工贸有限公司.txt',
     '广东乐裕生物科技有限公司.txt',
     '广东俏尔娜生物科技有限公司.txt',
     '广东利盈医药科技有限公司.txt',
     '广东天姿化妆品科技有限公司.txt',
     '广东微姿化妆品有限公司.txt',
     '广东瀚森生物科技有限公司.txt',
     '广东粤妆生物科技有限公司.txt',
     '广东聚康生物科技有限公司.txt',
     '广东菲塔赫医药生物科技有限公司.txt',
     '广东藤予草本科技发展有限公司.txt',
     '广东韵莉化妆品有限公司.txt',
     '广州中汉口腔用品有限公司.txt',
     '广州仙堡缘化妆品有限公司.txt',
     '广州八面喜生物科技有限公司.txt',
     '广州华人生物科技有限公司.txt',
     '广州博养堂健康产业有限公司.txt',
     '广州博林化妆品有限公司.txt',
     '广州品赫化妆品有限公司.txt',
     '广州哈倪蔓生物科技有限公司.txt',
     '广州唐美化妆品有限公司.txt',
     '广州圣芳医药科技有限公司.txt',
     '广州多美生物科技有限公司.txt',
     '广州天芝丽实业有限公司.txt',
     '广州市医康生物科技有限公司.txt',
     '广州市名宇化妆品制造有限公司.txt',
     '广州市天海医药科技有限公司.txt',
     '广州市婷采化妆品有限公司.txt',
     '广州市梦洁日用品有限公司.txt',
     '广州市番禺区石基彤丽化妆品厂.txt',
     '广州市白云区文浩精细化工厂.txt',
     '广州市白云区浩康精细化工厂.txt',
     '广州市皓雨化妆品有限公司.txt',
     '广州市经典伊秀化妆品有限公司.txt',
     '广州市胜蔻生物科技有限公司.txt',
     '广州市莱萃化妆品有限公司.txt',
     '广州市蓝洁生物科技有限公司.txt',
     '广州市金宸生物科技有限公司.txt',
     '广州市高维化妆品有限公司.txt',
     '广州御妆化妆品有限公司.txt',
     '广州御采堂化妆品有限公司.txt',
     '广州御韵生物科技有限公司.txt',
     '广州思薇伦特美容生物科技有限公司.txt',
     '广州时尚星约化妆品有限公司.txt',
     '广州智云高姿生物科技有限公司.txt',
     '广州梦飞诗医药科技有限公司.txt',
     '广州梵宇日用化妆品有限公司.txt',
     '广州汉典化妆品有限公司.txt',
     '广州法兰馨得生物科技有限公司.txt',
     '广州温雅日用化妆品有限公司.txt',
     '广州爱莉化妆品有限公司.txt',
     '广州白云山拜迪生物医药有限公司.txt',
     '广州缘生源化妆品有限公司.txt',
     '广州美蔻生物科技有限公司.txt',
     '广州美颜魔法生物科技有限公司.txt',
     '广州臻美颜生物科技有限公司.txt',
     '广州臻颜化妆品有限公司.txt',
     '广州艾尚莉生物科技有限公司.txt',
     '广州蓝懋生物科技有限公司.txt',
     '广州谷瑞日化有限公司.txt',
     '广州逦诚化妆品有限公司.txt',
     '广州金娜宝生物科技有限公司.txt',
     '广州金皙儿生物科技有限公司.txt',
     '广州香枝化妆品有限公司.txt',
     '广西鹤兰墨广泽生物科技有限公司.txt',
     '新疆旺源生物科技集团有限公司.txt',
     '武汉卡伊娜化妆品有限公司.txt',
     '汕头市鹏利隆生物科技有限公司.txt',
     '江苏亨瑞生物医药科技有限公司.txt',
     '江苏娜维日用品实业有限公司.txt',
     '江苏普罗诺生物科技有限公司.txt',
     '江苏省苏盐生活家股份有限公司化妆品分公司.txt',
     '江苏舒适生物科技有限公司.txt',
     '江苏英涛皮肤医学研究院有限公司.txt',
     '江西乔盛茶皂素科技有限公司.txt',
     '江西鸿仁堂生物科技有限公司.txt',
     '沃德(天津)营养保健品有限公司.txt',
     '沈阳火氏美容产品有限公司.txt',
     '沈阳飞龙伟业医药科技有限公司.txt',
     '海南雁龙生物医药科技有限公司.txt',
     '海发生物科技南通有限公司.txt',
     '深圳市东尼达日用品有限公司惠东分公司.txt',
     '深圳市妆胜化妆品有限公司.txt',
     '深圳市赛亚气雾剂有限公司.txt',
     '深圳绵俪日用化工有限公司绵俪日用化工厂.txt',
     '深圳莱茵生物科技有限公司.txt',
     '清远市伯堂生物科技有限公司.txt',
     '湖北千层水生物科技有限公司.txt',
     '珠海安和生化科技有限公司.txt',
     '珠海美逸生物科技有限公司.txt',
     '科美尔(广州)生物科技有限公司.txt',
     '美尔健(深圳)生物科技有限公司.txt',
     '英德市藻米美妆产业有限公司.txt',
     '蔚伊思美容品(武汉)有限公司.txt',
     '西藏珂莱蒂生物科技开发有限公司.txt',
     '解忧公主(广州)生物科技有限公司.txt',
     '诺斯贝尔化妆品股份有限公司.txt',
     '赣州澳丽尔化妆品有限公司.txt',
     '重庆创园生物科技有限公司.txt',
     '霸王(广州)有限公司.txt',
     '青蛙王子(福建)婴童护理用品有限公司.txt']
    共计下载企业信息90

    3.代理网站ip,port爬取

    • 示例代码
    # -*- coding:utf-8 -*-
    
    import requests
    import random
    from lxml import etree
    from pprint import pprint
    
    
    def get_proxies():
        url = "https://ip.jiangxianli.com/?"
        params = {
            "page": "1",
            "country": "中国"
        }
        headers = {
            "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 "
                          "(KHTML, like Gecko) Chrome/85.0.4183.121 Mobile Safari/537.36"}
    
        proxies = [
            {"http": "39.106.223.134:80"},
            {"http": "61.135.186.222:80"},
            {"http": "61.135.185.38:80"},
        ]
        requests.packages.urllib3.disable_warnings()  # 移除警告
        response = requests.get(url=url, headers=headers, params=params, proxies=random.choice(proxies), verify=False)
        # response.encoding="utf8"
        status_code = response.status_code
    
        if status_code == 200:
            page_content = response.content
    
            html = etree.HTML(page_content)
            base_tr_list = html.xpath("/html/body/div[1]/div[2]/div[1]/div[1]/table/tbody/tr")
            poxies_list = list()
            for tr in base_tr_list:
    
                ip = tr.xpath("./td[1]/text()")[0]
                port = tr.xpath("./td[2]/text()")[0]
                ip_type = tr.xpath("./td[4]/text()")[0]
                d = {}
                if ip_type == "HTTP":
                    d[ip_type] = ip + ":" + port
                else:
                    d[ip_type] = ip + ":" + port
                poxies_list.append(d)
            for p in poxies_list:
                print(p)
            return poxies_list
    
    
    if __name__ == '__main__':
        result=get_proxies()
        print(result)
    
    
    
    • 运行结果
    [{'HTTP': '61.135.186.222:80'}, 
    {'HTTP': '61.135.186.80:80'}, 
    {'HTTP': '61.135.186.243:80'}, 
    {'HTTP': '61.135.185.20:80'}, 
    {'HTTP': '61.135.185.78:80'}, 
    {'HTTP': '61.135.185.68:80'}, 
    {'HTTP': '61.135.185.38:80'}, 
    {'HTTP': '61.135.185.92:80'}, 
    {'HTTP': '61.135.185.69:80'}, 
    {'HTTP': '61.135.185.31:80'}, 
    {'HTTP': '115.223.7.110:80'}, 
    {'HTTP': '61.135.185.90:80'}, 
    {'HTTP': '61.135.185.176:80'}, 
    {'HTTP': '61.135.185.12:80'}, 
    {'HTTP': '61.135.185.111:80'}]
    

    4.糗事百科首页段子爬取

    • 示例代码
    # -*- coding:utf-8 -*-
    import requests
    from lxml import etree
    from getproxies_01 import get_proxies
    import random
    from pprint import pprint
    
    url = "https://www.qiushibaike.com/text/"
    proxies = get_proxies()
    response = requests.get(url=url, proxies=random.choice(proxies))
    response.encoding = "utf8"
    response = response.text
    html = etree.HTML(response)
    div_list = html.xpath('//div[@class="col1 old-style-col1"]/div')
    passages=list()
    for div in div_list:
        author_name = div.xpath('./div[@class="author clearfix"]/a[2]/h2/text()')[0]  # 获取作者名称,返回的是列表,取其中的内容
        author_name = author_name.replace("\n", "")  # 移除空格
        content = div.xpath('./a/div[@class="content"]/span//text()')
        content = "".join(content)
        content = content.replace("\n", "")
        # print("author_name:{}".format(author_name))
        # print("content:{}".format(content))
        # print()
        d=dict()
        d["name"]=author_name
        d["content"]=content
        passages.append(d)
    pprint(passages)
    
    • 运行结果
    [{'content': '和女友吵架了,她哭着跑回家。临走前,她撕心裂肺地吼道:你说过不伤我的。我追到她家,决定跟她分手!她正在家用石膏做石雕,桌上摆满存钱罐。我问道:这些罐子咋有大有小?她冷笑道:我照着前男友们的脑袋做的。她掏出锤子,把其中一个存钱罐敲得稀碎,转头对我说道:你来做什么?我头皮发麻,颤声道:我们结婚吧?',
      'name': '-小门神~'},
     {'content': '国庆假期,我一个人开车从厦门回重庆老家,打电话给老公,说快到两省交界处,尿急了。老公笑着说:没事,开车到服务区,歇一歇,上个洗手间。我说:可是堵住了啊。老公一惊:堵住?用什么堵住了啊?我这头急了:你特喵想什么啊?我是说车堵住啦,堵车!',
      'name': '璃白°'},
     {'content': '生物课上,老师唾沫横飞的讲人和动物的区别是直立行走和使用工具。小明同学却在开小差被点名。老师:“人和动物的主要区别是什么?”小明懵圈三秒:“人和动物的主要区别是~人会掉头发,动物不会。”眼睛盯着老师的“地中海”急中生智!老师:“滚出去……”',
      'name': '璃白°'},
     {'content': '那时在厂里上班,和厂门口牛肉面馆老板的女儿恋爱啦。我每天早上都去她家吃牛肉面,让我感动的是,她父母不但没有嫌弃我是个穷小子,没车没房,还对我特别好。她爸爸每次端给我的牛肉面,都是一大碗牛肉,上面稀稀疏疏飘着几根面条。一年后,我胖成180斤,女朋友和我分手啦。',
      'name': '空城旧梦她与伞'},
     {'content': '小时候看了电影魔表,我一直想有一块这样的表,快点长大,这样就不用做作业了!以至于我用全部的压岁钱都用来买电子表了。可是每一次都以失败而结束,而我每一次都少不了一顿毒打。幸好每次母亲都拦着父亲我才能活到现在。在一次意外我听到父母的谈话说:孩子她 '
                 '妈,下次换你打了,每次都是你做好人,现在这丫头都不理我了!知道真相的我才明白,原来每次打我都是商量着来的[大哭][大哭][大哭]',
      'name': '夏有凉风秋望月'},
     {'content': '什么才是真正的爱情?奶奶85岁,牙掉了,要去医院看牙科。爷爷89岁,腿脚不方便,不顾家里人的反对,非要一起上医院陪着,犟得很。诊室门口,患者家属只能在门外等,爷爷就站在门前,眼巴巴地往里看。我说:“爷爷,你别着急,拔牙可快了,一会儿就好了。”爷爷说:“你奶奶胆儿小,怕疼,我不是着急,我是怕她拔牙害怕。”爷爷嫌家里的钟点工擦窗户不干净,趁奶奶出门遛弯儿时,自己逞强爬上爬下的擦窗户,把腰闪了。奶奶很生气,一个星期没下楼活动,遛弯儿也不去了,拿报纸也不去了,每天寸步不离地看着他。爷…查看全文',
      'name': '不次葡萄皮皮'},
     {'content': '和闺蜜吵架了,冷战中。。。有快递送货上门,帅小伙问我闺蜜:***(我)快递签收!闺蜜打开门生气的的说:她死了!“嘭”的一声,关门。一直没收到快递,我就问客服:我的快递物流怎么退回去了?客服小MM很惊悚失声:你是人是鬼?退货原因写着:收件人已离世。。。',
      'name': '骑着二哈啃黄瓜'},
     {'content': '男友出差回来被隔离在酒店,连我都看不到一面。今天有事出门,临近中午的时候闺蜜给我发来信息问:月月,在哪呢?我请你喝奶茶,是你喜欢的微辣型的口味。我在火葬场呢!我不来了。谁知道这二货激动的说:月月,他刚感染就这么快走了,你别伤心,我把我哥哥介绍给你。',
      'name': '夏有凉风秋望月'},
     {'content': '老婆闺蜜十一结婚,我总算可以报仇雪恨了。那天还差一个伴娘,新时代了嘛,老婆闺蜜就邀请我老婆去当伴娘,我怎么会放弃这个机会呢。于是我穿上了伴娘的裙子,把藏鞋和堵门的任务都揽了下来。把当年她闺蜜怎么为难我的都加倍还给她老公。',
      'name': '净心居士'},
     {'content': '每天晚上我都会陪媳妇跑步两公里,只因为她说了,想要身材更完美。经过媳妇的不懈努力,媳妇终于又瘦了!我却胖了好多!因为每次我都是边跑边抢媳妇最喜欢吃的零食吃,不这样刺激她,她跑不动……',
      'name': '小恩的老公8'},
     {'content': '我发现旧衣服可以捐赠以后,就热衷于把旧衣服源源不断的捐赠。。。\xa0\xa0\xa0\xa0\xa0\xa0\xa0 '
                 '就在刚才,我和胖哥哭诉:胖了,衣服和裤子穿的扣子都崩掉了,穿不了都捐掉了,现在只有身上唯一的一套勉强可以蔽体。。。。\xa0\xa0\xa0\xa0\xa0\xa0\xa0 '
                 '胖哥哭笑不得:今年四月你可是说瘦了,衣服穿的松松垮垮的,穿不了就捐掉了,身上唯一的一套勉强维持我的体面。。。',
      'name': '坏小孩cium'},
     {'content': '项目部陆经理新买了房,说是距离火车站很近只隔了五栋楼,可把他嘚瑟坏了, '
                 '到处说,同事们也是各种阿谀奉承,都说陆经理家房位置怎么怎么好…楼主随口接了一句:火车站近是近,过年回家不是一样买不到票?叽叽喳喳的议论声戛然而止,大家齐刷刷的看着我……………都特么看我干嘛……………',
      'name': '做你的太阳^^'},
     {'content': '在五金店买了块强力磁铁,路过水果摊,水果摊用的杆秤,那天不知道怎么回事,一大袋苹果怎么称都是八两,最后水果摊老板哭着给我了。。。',
      'name': '坏小孩cium'},
     {'content': '老爸打算翻新后院的老墙,他拉了一车砖,一块块在墙角下垒好。我当时在码字,隔着窗户看他在忙碌着。我高喊道:爸你歇歇,等下我来。老爸说他吃得消,可没过多久他来到我房间,气喘吁吁道:还是你去垒吧?我笑着问:是不是吃不消啊?他摇摇头,说道:那墙太老了,我在下面垒砖,总怕墙塌下来砸到我……',
      'name': '-小门神~'},
     {'content': '楼上新搬来一个妹子,长得挺漂亮,傍晚常常见她一个人下楼遛狗。这天,妹子敲门进来,我妈热情招待。寒暄了一阵,妹子红着脸对我妈说:阿姨,我能带走您家的单身狗吗?我妈望了望坐在沙发上的我,喜笑颜开:可以啊,带着吧。妹子站起身,朝我走来,伸出双手…………,抱走了我脚下,那只我家刚买半个月的小泰迪。',
      'name': '空城旧梦她与伞'},
     {'content': '我在台下,亲眼目睹前女友和别人结婚。我不顾一切冲上舞台,婚礼的司仪却阻拦我,问我是谁打算做什么。我抢过司仪手中话筒,质问前女友道:你真的愿意嫁给他吗?面对我的质问,她沉默了。司仪觉得我的质问方式很耳熟,恍然大悟对我说道:同行,你这样抢我饭碗,不太厚道吧??…………',
      'name': '-小门神~'},
     {'content': '老婆怀孕三个月,一天肚子不舒服,带她去医院检查。医生问:“最近有没有同房?”我马上回答说没有。医生说:“别打岔,不是问你,是问你媳妇。”尼妹,这几个意思???!!!',
      'name': '£白玉汤'},
     {'content': '给闺蜜介绍男朋友,也就是我男同事,为了避免相亲介绍的尬,创造邂逅的局面,就和男同事约个饭局,他爽快的答应,然后让我闺蜜恰巧来这里吃饭,我遇到叫她一起叫来组桌吃饭的样子。闺蜜刚入座,男同事发现了有个他以前公司的男同事,也来这里吃饭正打招呼让过来一起吃呢,额,这,迷茫了。。。',
      'name': '夏有凉风秋望月'},
     {'content': '丈母娘跟老丈人是同一天生日,老婆让给他们发500块钱。这可给我出了个难题,如果一个人发300另一个人200肯定有个人骂我!于是我给他们一人发了250 '
                 ',这样都一样多肯定没人会骂我。',
      'name': '孤心傲月'},
     {'content': '我有个朋友,心思敏感,做什么事都害怕会伤害到人家。这天我看到她一个人蹲在我们小区门口,看着车来车往,满脸的不开心的样子。我见状,急忙放下手中的菜和肉,快步走到她身边。我问她,怎么了?遇到什么难处了吗?她嗫嚅着没有开口,只是一个劲地唉声叹气。我说她,以后做事不要这么犹豫,心里有什么就说什么!要是总这么憋着藏着,迟早会憋出病的!她听了我的话后,似乎很受用。沉默好一会儿之后,她终于勇敢地抬头看向我,“鱼,我半年前借你的两千块钱,你什么时候还我?我好长时间,没……吃到肉了!”',
      'name': '鱼小鱼喵喵喵'},
     {'content': '带儿子逛街逛累了,之后就随便钻进一家餐馆吃饭。汤足饭饱之后,我脑袋有点懵……莫名感觉周围景物有种从未有过的陌生感。儿子拉了拉我的手,眼神中带着前所未有的鄙夷。“妈妈!说实话,你是不是又又又迷路了???”紧接着儿子伸出他胖乎乎的小手,带着我朝前拐了几个弯。大概也就两三百米吧,我们俩就这么神奇地来到了自家的小区门口。',
      'name': '鱼小鱼喵喵喵'},
     {'content': '哥们开了一个加油站朋友圈也发过了,我就看到他统一回复:谢谢大伙捧场,一定过来加油啊!昨天我正好路过那里心想着那就进去吧,离目标还有200米的时候我停住了,把我的破五羊放在了一个不起眼的地方,一路走着过去的为啥我要走着过去?他加油站那门口站着好几辆交J的车,我连个牌子都没有[捂脸]哪敢骑着去加油啊我刚走进去就听到哥们和他交J朋友的谈话哥们:哥们你们的人都来了半个月了,兄弟们都辛苦了!可不可以换个地方?比如,村东头的那家油站:怎么了哥们?我这么多兄弟都过来喝你的饮料这也挣了不少…查看全文',
      'name': '捉女妖的天师'},
     {'content': '去年快过年的时候,别人送给我爸一只大龙虾,据说光虾身就有半米长。我爸喜滋滋的给我打电话让我回去吃龙虾,但是那几天比较忙,就告诉他两天后回去。龙虾太大冰箱放不下,于是我爸就拿根绳子系住龙虾,然后把它挂在窗户外面!我在家艰难的渡过两天,期间查阅大量菜谱,脑补了N种美味做法!两天后带着好酒好菜回到家,我爸看见我进屋,转身就去拿龙虾。我屁颠屁颠的跟着去,只见我爸打开窗户“卧槽~”了一声后,脸色大变!我觉得奇怪就凑过去往外看。只见一根绳子孤零零的系在防盗栏上(我家二楼),断口无比整齐,龙虾已经不翼而…查看全文',
      'name': '糖醋小新'},
     {'content': '两年前在某地上班的时候,给我安排了个女同事,美其名曰男 女 搭 配 ,干 活 不 累 '
                 '。可是我想说的是我自己的工作都干不完还得帮她,初此之外还得帮她拿快递,帮她打饭。当时我心里美滋滋的,想着就现在女同事对我的态度弄不好我走可能脱单,月底的时候她说要请我吃饭,我想怎么也不可能让女孩子请吃饭呀,于是我安排了一桌,弄点蜡烛,整个烛光晚餐。让我没想到的是她把她男朋友带来了,看着我弄的烛光晚餐她跟他男朋友说:“你看我就说胖哥哥是好人吧,人家不但请咱们俩吃饭,还给咱们准备了烛光晚餐,你赶紧…查看全文',
      'name': '花落彼岸~任逍遥'},
     {'content': '我刚回家,侄儿因为玩乱拆家用电器被狂揍。。。一看到我回来,侄儿疯狂求救,我制止了嫂子:嫂子,这又犯啥天条啦?嫂子加重力道:跟他讲几遍了,通电的情况下不能玩家用电器,很危险。我寻思着,这种原则性的东西是得揍奏才能长记性,于是我就在没有制止,溜进房间开直播了。。。我正播着呢,回直播间提问:对呀,我单身呢,没男朋友呢。。。侄儿轻漂漂走到我旁边,对着我说:妈,几个爸爸们打起来了,你快点过去看看鸭。。。我去,这 '
                 '兔 崽 子 玩 报 复。。。。',
      'name': '璃白°'}]
    
    展开全文
  • python爬虫三个经典案例与selenium的使用文档
  • 比如Django框架就是MVC的开发框架,但它还提供了其他基础功能帮助我们快速开发,比如中间件、认证系统等框架的关注点在于规范二字,好,我们要写的Python爬虫框架规范是什么?很简单,爬虫框架就是对爬虫流程规范的...

    什么是爬虫框架

    说这个之前,得先说说什么是框架:

    是实现业界标准的组件规范:比如众所周知的MVC开发规范

    提供规范所要求之基础功能的软件产品:比如Django框架就是MVC的开发框架,但它还提供了其他基础功能帮助我们快速开发,比如中间件、认证系统等

    框架的关注点在于规范二字,好,我们要写的Python爬虫框架规范是什么?

    很简单,爬虫框架就是对爬虫流程规范的实现,不清楚的朋友可以看上一篇文章谈谈对Python爬虫的理解,下面总结一下爬虫流程:

    请求&响应

    解析

    持久化

    这三个流程有没有可能以一种优雅的形式串联起来,Ruia目前是这样实现的,请看代码示例:

    2052941-20200622101720236-1046997491.png

    可以看到,Item & Field类结合一起实现了字段的解析提取,Spider类结合Request * Response类实现了对爬虫程序整体的控制,从而可以如同流水线一般编写爬虫,最后返回的item可以根据使用者自身的需求进行持久化,这几行代码,我们就实现了获取目标网页请求、字段解析提取、持久化这三个流程

    实现了基本流程规范之后,我们继而就可以考虑一些基础功能,让使用者编写爬虫可以更加轻松,比如:中间件(Ruia里面的Middleware)、提供一些hook让用户编写爬虫更方便(比如ruia-motor)

    这些想明白之后,接下来就可以愉快地编写自己心目中的爬虫框架了

    如何踏出第一步

    首先,我对Ruia爬虫框架的定位很清楚,基于asyncio & aiohttp的一个轻量的、异步爬虫框架,怎么实现呢,我觉得以下几点需要遵守:

    轻量级,专注于抓取、解析和良好的API接口

    插件化,各个模块耦合程度尽量低,目的是容易编写自定义插件

    速度,异步无阻塞框架,需要对速度有一定追求

    什么是爬虫框架如今我们已经很清楚了,现在急需要做的就是将流程规范利用Python语言实现出来,怎么实现,分为哪几个模块,可以看如下图示:

    2052941-20200622101730020-670009606.png

    同时让我们结合上面一节的Ruia代码来从业务逻辑角度看看这几个模块到底是什么意思:

    Request:请求

    Response:响应

    Item & Field:解析提取

    Spider:爬虫程序的控制中心,将请求、响应、解析、存储结合起来

    这四个部分我们可以简单地使用五个类来实现,在开始讲解之前,请先克隆Ruia框架到本地:

    #请确保本地Python环境是3.6+

    git clone https://github.com/howie6879/ruia.git

    #安装pipenv

    pip install pipenv

    #安装依赖包

    pipenv install --dev

    然后用PyCharm打开Ruia项目:

    2052941-20200622101743964-164822061.png

    选择刚刚pipenv配置好的python解释器:

    2052941-20200622101753075-376916415.png

    此时可以完整地看到项目代码:

    2052941-20200622101806007-2013875492.png

    好,环境以及源码准备完毕,接下来将结合代码讲述一个爬虫框架的编写流程

    Request & Response

    Request类的目的是对aiohttp加一层封装进行模拟请求,功能如下:

    封装GET、POST两种请求方式

    增加回调机制

    自定义重试次数、休眠时间、超时、重试解决方案、请求是否成功验证等功能

    将返回的一系列数据封装成Response类返回

    接下来就简单了,不过就是实现上述需求,首先,需要实现一个函数来抓取目标url,比如命名为fetch:

    import asyncio

    import aiohttp

    import async_timeout

    from typing import Coroutine

    class Request:

    # Default config

    REQUEST_CONFIG = {

    'RETRIES': 3,

    'DELAY': 0,

    'TIMEOUT': 10,

    'RETRY_FUNC': Coroutine,

    'VALID': Coroutine

    }

    METHOD = ['GET', 'POST']

    def __init__(self, url, method='GET', request_config=None, request_session=None):

    self.url = url

    self.method = method.upper()

    self.request_config = request_config or self.REQUEST_CONFIG

    self.request_session = request_session

    @property

    def current_request_session(self):

    if self.request_session is None:

    self.request_session = aiohttp.ClientSession()

    self.close_request_session = True

    return self.request_session

    async def fetch(self):

    """Fetch all the information by using aiohttp"""

    if self.request_config.get('DELAY', 0) > 0:

    await asyncio.sleep(self.request_config['DELAY'])

    timeout = self.request_config.get('TIMEOUT', 10)

    async with async_timeout.timeout(timeout):

    resp = await self._make_request()

    try:

    resp_data = await resp.text()

    except UnicodeDecodeError:

    resp_data = await resp.read()

    resp_dict = dict(

    rl=self.url,

    method=self.method,

    encoding=resp.get_encoding(),

    html=resp_data,

    cookies=resp.cookies,

    headers=resp.headers,

    status=resp.status,

    history=resp.history

    )

    await self.request_session.close()

    return type('Response', (), resp_dict)

    async def _make_request(self):

    if self.method == 'GET':

    request_func = self.current_request_session.get(self.url)

    else:

    request_func = self.current_request_session.post(self.url)

    resp = await request_func

    return resp

    if __name__ == '__main__':

    loop = asyncio.get_event_loop()

    resp = loop.run_until_complete(Request('https://docs.python-ruia.org/').fetch())

    print(resp.status)

    实际运行一下,会输出请求状态200,就这样简单封装一下,我们已经有了自己的请求类Request,接下来只需要再完善一下重试机制以及将返回的属性封装一下就基本完成了:

    # 重试函数

    async def _retry(self):

    if self.retry_times > 0:

    retry_times = self.request_config.get('RETRIES', 3) - self.retry_times + 1

    self.retry_times -= 1

    retry_func = self.request_config.get('RETRY_FUNC')

    if retry_func and iscoroutinefunction(retry_func):

    request_ins = await retry_func(weakref.proxy(self))

    if isinstance(request_ins, Request):

    return await request_ins.fetch()

    return await self.fetch()

    最终代码见ruia/request.py即可,接下来就可以利用Request来实际请求一个目标网页,如下:

    2052941-20200622101816154-673582631.png

    这段代码请求了目标网页https://docs.python-ruia.org/并返回了Response对象,其中Response提供属性介绍如下:

    1460000018513386?w=591&h=525

    Field & Item

    实现了对目标网页的请求,接下来就是对目标网页进行字段提取,我觉得ORM的思想很适合用在这里,我们只需要定义一个Item类,类里面每个属性都可以用Field类来定义,然后只需要传入url或者html,执行过后Item类里面 定义的属性会自动被提取出来变成目标字段值

    可能说起来比较拗口,下面直接演示一下可能你就明白这样写的好,假设你的需求是获取HackerNews网页的title和url,可以这样实现:

    import asyncio

    from ruia import AttrField, TextField, Item

    class HackerNewsItem(Item):

    target_item = TextField(css_select='tr.athing')

    title = TextField(css_select='a.storylink')

    url = AttrField(css_select='a.storylink', attr='href')

    async def main():

    async for item in HackerNewsItem.get_items(url="https://news.ycombinator.com/"):

    print(item.title, item.url)

    if __name__ == '__main__':

    items = asyncio.run(main())

    2052941-20200622101827177-1615870020.png

    从输出结果可以看到,title和url属性已经被赋与实际的目标值,这样写起来是不是很简洁清晰也很明了呢?

    来看看怎么实现,Field类的目的是提供多种方式让开发者提取网页字段,比如:

    XPath

    CSS Selector

    RE

    所以我们只需要根据需求,定义父类然后再利用不同的提取方式实现子类即可,代码如下:

    class BaseField(object):

    """

    BaseField class

    """

    def __init__(self, default: str = '', many: bool = False):

    """

    Init BaseField class

    url: http://lxml.de/index.html

    :param default: default value

    :param many: if there are many fields in one page

    """

    self.default = default

    self.many = many

    def extract(self, *args, **kwargs):

    raise NotImplementedError('extract is not implemented.')

    class _LxmlElementField(BaseField):

    pass

    class AttrField(_LxmlElementField):

    """

    This field is used to get attribute.

    """

    pass

    class HtmlField(_LxmlElementField):

    """

    This field is used to get raw html data.

    """

    pass

    class TextField(_LxmlElementField):

    """

    This field is used to get text.

    """

    pass

    class RegexField(BaseField):

    """

    This field is used to get raw html code by regular expression.

    RegexField uses standard library `re` inner, that is to say it has a better performance than _LxmlElementField.

    """

    pass

    核心类就是上面的代码,具体实现请看ruia/field.py

    接下来继续说Item部分,这部分实际上是对ORM那块的实现,用到的知识点是元类,因为我们需要控制类的创建行为:

    class ItemMeta(type):

    """

    Metaclass for an item

    """

    def __new__(cls, name, bases, attrs):

    __fields = dict({(field_name, attrs.pop(field_name))

    for field_name, object in list(attrs.items())

    if isinstance(object, BaseField)})

    attrs['__fields'] = __fields

    new_class = type.__new__(cls, name, bases, attrs)

    return new_class

    class Item(metaclass=ItemMeta):

    """

    Item class for each item

    """

    def __init__(self):

    self.ignore_item = False

    self.results = {}

    这一层弄明白接下来就很简单了,还记得上一篇文章《谈谈对Python爬虫的理解》里面说的四个类型的目标网页么:

    单页面单目标

    单页面多目标

    多页面单目标

    多页面多目标

    本质来说就是要获取网页的单目标以及多目标(多页面可以放在Spider那块实现),Item类只需要定义两个方法就能实现:

    get_item():单目标

    get_items():多目标,需要定义好target_item

    具体实现见:ruia/item.py

    Spider

    在Ruia框架中,为什么要有Spider,有以下原因:

    真实世界爬虫是多个页面的(或深度或广度),利用Spider可以对这些进行 有效的管理

    制定一套爬虫程序的编写标准,可以让开发者容易理解、交流,能迅速产出高质量爬虫程序

    自由地定制插件

    接下来说说代码实现,Ruia框架的API写法我有参考Scrapy,各个函数之间的联结也是使用回调,但是你也可以直接使用await,可以直接看代码示例:

    from ruia import AttrField, TextField, Item, Spider

    class HackerNewsItem(Item):

    target_item = TextField(css_select='tr.athing')

    title = TextField(css_select='a.storylink')

    url = AttrField(css_select='a.storylink', attr='href')

    class HackerNewsSpider(Spider):

    start_urls = [f'https://news.ycombinator.com/news?p={index}' for index in range(1, 3)]

    async def parse(self, response):

    async for item in HackerNewsItem.get_items(html=response.html):

    yield item

    if __name__ == '__main__':

    HackerNewsSpider.start()

    使用起来还是挺简洁的,输出如下:

    [2019:03:14 10:29:04] INFO Spider Spider started!

    [2019:03:14 10:29:04] INFO Spider Worker started: 4380434912

    [2019:03:14 10:29:04] INFO Spider Worker started: 4380435048

    [2019:03:14 10:29:04] INFO Request

    [2019:03:14 10:29:04] INFO Request

    [2019:03:14 10:29:08] INFO Spider Stopping spider: Ruia

    [2019:03:14 10:29:08] INFO Spider Total requests: 2

    [2019:03:14 10:29:08] INFO Spider Time usage: 0:00:03.426335

    [2019:03:14 10:29:08] INFO Spider Spider finished!

    Spider的核心部分在于对请求URL的请求控制,目前采用的是生产消费者模式来处理,具体函数如下:

    2052941-20200622101837554-1410088362.png

    详细代码,见ruia/spider.py

    更多

    至此,爬虫框架的核心部分已经实现完毕,基础功能同样一个不落地实现了,接下来要做的就是:

    实现更多优雅地功能

    实现更多的插件,让生态丰富起来

    修BU

    更多推荐:

    展开全文
  • 原标题:最简单的Python爬虫案例,看得懂说明你已入门,附赠教程这是最简单的Python爬虫案例,如果你能看懂,那么请你保持信心,因为你已经入门Python爬虫,只要带着信心和努力,你的技术能力在日后必定价值15K月薪...

    原标题:最简单的Python爬虫案例,看得懂说明你已入门,附赠教程

    这是最简单的Python爬虫案例,如果你能看懂,那么请你保持信心,因为你已经入门Python爬虫,只要带着信心和努力,你的技术能力在日后必定价值15K月薪。

    e6682e65de644d9092b1fdf35fa6b089.jpeg

    这次是要爬取网易新闻,包括新闻标题、作者、来源、发布时间、正文等。

    第一步,我们先找到网易新闻的网站,并且打开,选择其中的某一个分类,比如:国内新闻,然后点击鼠标的右键查看源代码。

    如果你遇到了以下这种情况:

    在源代码中并没有页面正中的新闻列表。这说明此网页采用的是异步的方式。也就是通过api接口获取的数据。

    在确认之后,用F12打开谷歌浏览器的控制台,点击 Network,我们一直往下拉,发现右侧出现了:"… special/00804KVA/cm_guonei_03.js? … "之类的地址,点开Response发现正是我们要找的api接口。

    可以看到这些接口的地址都有一定的规律:“cm_guonei_03.js”、“cm_guonei_04.js”,那么就很明显了:

    http://temp.163.com/special/00804KVA/cm_guonei_0(*).js

    上面的链接也就是我们本次抓取所要请求的地址。

    接下来只需要用到的python的两个库:

    requestsjsonBeautifulSoup

    requests库就是用来进行网络请求的,说白了就是模拟浏览器来获取资源。由于我们采集的是api接口,它的格式为json,所以要用到json库来解析。BeautifulSoup是用来解析html文档的,可以很方便的帮我们获取指定div的内容。

    下面我们正式进入爬虫程序的编写

    第一步先导入以上三个包:

    9d251e0d5a9a4c9c922e2f22fecb0d2e.png

    接着我们定义一个获取指定页码内数据的方法:

    7325808624ac4baa801d5da812ddd0d3.png

    这样子就得到每个页码对应的内容列表:

    5360e0a385c244b9b65c22a9e3cd84d7.png

    之后通过分析数据可知下图圈出来的则是需要抓取的标题、发布时间以及新闻内容页面。

    既然现在已经获取到了内容页的url,那么接下来开始抓取新闻正文。

    在抓取正文之前要先分析一下正文的html页面,找到正文、作者、来源在html文档中的位置。

    我们看到文章来源在文档中的位置为:id = “ne_article_source” 的 a 标签。作者位置为:class = “ep-editor” 的 span 标签。正文位置为:class = “post_text” 的 div 标签。

    下面采集这三个内容的代码:

    88c24645ea924c80b141c140159dfe6b.png

    到此为止我们所要抓取的所有数据都已经采集了。

    那么接下来当然是把它们保存下来,为了方便我直接采取文本的形式来保存。下面是最终的结果:

    bce9fec06d9442218671f266f5f1b47b.png

    格式为json字符串,“标题” : [ "日期’, "url’, "来源’, "作者’, "正文’ ]。

    要注意的是目前实现的方式是完全同步的,线性的方式,存在的问题就是采集会非常慢。主要延迟是在网络IO上,下次可以升级为异步IO,异步采集,有兴趣的可以关注下次的文章。

    通过本次练手,各位应该会对爬虫有一个入门级的了解。如果需要更多的2019年的Python爬虫教程资料,可以通过我上面提供的方式找我领取。返回搜狐,查看更多

    责任编辑:

    展开全文
  • python爬虫案例——csdn数据采集

    千次阅读 2017-10-29 20:13:02
    python爬虫案例——csdn数据采集通过python实现csdn页面的内容采集是相对来说比较容易的,因为csdn不需要登陆,不需要cookie,也不需要设置header本案例使用python实现csdn文章数据采集,获取我的博客下每篇文章的...
  • Python程序设计第章10基于Scrapy架构的Python爬虫案例分析前言 本章我们首先将以互联网上最流行的网络爬虫为基础学习与掌握网络爬虫的基本原理和实现技术随后讲解实现网络爬虫的Scrapy架构最后开发几种典型的网络...
  • 各种python爬虫案例.zip

    2021-03-05 17:15:37
    这里面包含了各种各样的爬虫案例,非常适合学习参考。所有代码可运行,没有任何bug。
  • Python 爬虫案例(一)

    2018-08-22 14:07:53
    Python 爬虫案例(一) 对于初学爬虫的人来说,看些案例是非常有帮助的,该篇用PyCharm为工具,以scrapy为框架进行了一次简单的爬取,爬取的网站是http://www.wicomicocounty.org/bids.aspx,爬取的目标就是获取标书...
  • python爬虫案例——百度贴吧数据采集通过python实现百度贴吧页面的内容采集是相对来说比较容易的,因为百度贴吧不需要登陆,不需要cookie,不需要设置http的MIME头本案例使用python实现百度贴吧数据采集,获取百度...
  • python爬虫案例——糗事百科数据采集通过python实现糗事百科页面的内容采集是相对来说比较容易的,因为糗事百科不需要登陆,不需要cookie,不过需要设置http的MIME头,模拟浏览器访问才能正常请求本案例使用python...
  • 这是我自己在学习python爬虫之后完成的一个项目,其中遇到过问题,但是都是耐心的一个个去解决了,欢迎想学习python爬虫的朋友一起探讨一起进步
  • Python爬虫案例实战从零开始一站通;20章,共计129节,完整版,附源码;第一章:零基础入门Python网络爬虫 第二章、Urllib模块基础与糗事百科爬虫项目实战 第三章、淘宝商品图片爬虫开发实战 第四章、 用户代理池与...
  • 课程名称:【温馨提示:1. 你可以在PC端浏览器或者微信收藏该页面,以方便你快速找到这个课程;2. 课程相关资料可在课程PC端公告查看下载;...课程介绍:Python3爬虫三大案例实战分享:猫眼电影、今日头条...
  • Python 爬虫案例(二)--附件下载

    千次阅读 2018-09-02 16:09:43
    Python 爬虫案例(二) 此篇文章将爬取的网站是:http://www.warrensburg-mo.com/Bids.aspx 类型跟上一篇相似,但在这篇中会讲如何下载附件Scrapy框架中提供了FilesPipeline专门用于下载文件。另外以后发布的爬虫...
  • 一个 python 爬虫的小案例,超简单
  • Python3爬虫案例-爬取中国古诗网(运用request、正则、json) 废话不多说,直接上源代码,注释写的很清楚,直接可运行 想学懂代码的可以参考我之前相关blog 大概需要以下知识 Python3爬虫之request库 Python3爬虫之...
  • python爬虫案例——东方财富股票数据采集

    万次阅读 多人点赞 2017-11-02 15:41:16
    python教程全解 通过python爬取东方财富的股票信息。获取每只股票的:总市值 净资产 净利润 市盈率 市净率 毛利率 净利率 ROE先爬取股票汇总页面。 在进入每只股票的详情页,爬取每只股票的具体信息。需要安装...
  • python教程全解 各RSS网站参考http://blog.csdn.net/luanpeng825485697/article/details/78737510 今天我们使用python3.6来爬去百度新闻RSS中的数据,有了数据集,这样可以对样本数据集进行分类、聚类、推荐算法...
  • python爬虫案例——知乎数据采集

    千次阅读 2020-04-09 22:36:46
    python教程全解 首先你需要了解python数据挖掘库urllib、urllib2、cookie的知识。参考http://blog.csdn.net/luanpeng825485697/article/details/78383884 cookie模拟登陆 知乎需要设置cookie模拟登陆状态,...
  • 我想很多人学习Python都是在做爬虫,那么小编在这里用一个爬虫案例,给大家介绍一下Python2和3的区别 首先我们看看Python2的代码 Python3 那么你看到Python2和Python3的 区别了么 对于初学者而言小编还是建议...
  • 现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子且将该帖子里每个楼层发布的图片下载到本地。
  • 爬虫案例(一)中,是用urllib进行的。本案例中应用的是requests库,它会比urllib更加方便,requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。 1.安装requests库。 python没有安装requests模块...
  • import requests # 用于发送请求 from lxml import etree # 用xpath方式进行数据解析 ...headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0" ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,860
精华内容 10,344
关键字:

python爬虫案例

python 订阅
爬虫 订阅