精华内容
下载资源
问答
  • Python爬取网页数据

    万次阅读 多人点赞 2018-08-29 17:20:35
    都说python爬网页数据方便,我们今天就来试试,python爬取数据到底有方便 简介 爬取数据,基本都是通过网页的URL得到这个网页的源代码,根据源代码筛选出需要的信息 准备 IDE:pyCharm 库:requests、...

    都说python爬网页数据方便,我们今天就来试试,python爬取数据到底有多方便


    简介

    爬取数据,基本都是通过网页的URL得到这个网页的源代码,根据源代码筛选出需要的信息

    准备

    IDE:pyCharm
    库:requestslxml

    大概介绍一下,这俩库主要为我们做什么服务的
    requests:获取网页源代码
    lxml:得到网页源代码中的指定数据

    言简意赅有没有 ^_^

    搭建环境

    这里的搭建环境,可不是搭建python的开发环境,这里的搭建环境是指,我们使用pycharm新建一个python项目,然后弄好requests和lxml
    新建一个项目:

    光溜溜的啥也没有,新建个src文件夹再在里面直接新建一个Test.py吧

    依赖库导入
    我们不是说要使用requests吗,来吧
    由于我们使用的是pycharm,所以我们导入这两个库就会显的格外简单,如图:
    这里写图片描述
    Test.py中输入:

    import requests

    这个时候,requests会报红线,这时候,我们将光标对准requests,按快捷键:alt + enter,pycharm会给出解决之道,这时候,选择install package requests,pycharm就会自动为我们安装了,我们只需要稍等片刻,这个库就安装好了。lxml的安装方式同理.

    将这两个库安装完毕后,编译器就不会报红线了

    接下来进入快乐的爬虫时间

    获取网页源代码

    之前我就说过,requests可以很方便的让我们得到网页的源代码
    网页就拿我的博客地址举例好了:https://blog.csdn.net/it_xf?viewmode=contents
    获取源码:

    # 获取源码
    html = requests.get("https://blog.csdn.net/it_xf?viewmode=contents")
    # 打印源码
    print html.text

    代码就是这么简单,这个html.text便是这个URL的源码

    获取指定数据

    现在我们已经得到网页源码了,这时就需要用到lxml来来筛选出我们所需要的信息
    这里我就以得到我博客列表为例

    首先我们需要分析一下源码,我这里使用的是chrome浏览器,所以右键检查,便是这样一份画面:
    这里写图片描述
    然后在源代码中,定位找到第一篇
    像这样?
    这里写图片描述
    操作太快看不清是不是?
    我这里解释一下,首先点击源码页右上角的箭头,然后在网页内容中选中文章标题,这个时候,源码会定位到标题这里,
    这时候选中源码的标题元素,右键复制如图:

    得到xpath,嘿嘿,知道这是什么吗,这个东西相当于地址。比如网页某长图片在源码中的位置,我们不是复制了吗,粘贴出来看看长啥样

    //*[@id="mainBox"]/main/div[2]/div[1]/h4/a

    这里给你解释解释:

    // 定位根节点
    / 往下层寻找
    提取文本内容:/text()
    提取属性内容:/@xxxx

    后面两个我们还没有在这个表达式见过,待会说,先摆张图放出来

    表达式://*[@id="mainBox"]/main/div[2]/div[1]/h4/a
    我们来琢磨琢磨,首先,//表示根节点,也就是说啊,这//后面的东西为根,则说明只有一个啊
    也就是说,我们需要的东西,在这里面
    然后/表示往下层寻找,根据图片,也显而易见,div -> main -> div[2] -> div[1] -> h4 -> a
    追踪到a这里,我想,你们应该也就看得懂了,然后我们在后面加个/text,表示要把元素的内容提取出来,所以我们最终的表达式长这样:

    //*[@id="mainBox"]/main/div[2]/div[1]/h4/a/text()

    这个表达式只针对这个网页的这个元素,不难理解吧?
    那么这个东西怎么用呢?
    所有代码:

    import requests
    from lxml import etree
    
    html = requests.get("https://blog.csdn.net/it_xf?viewmode=contents")
    # print html.text
    
    etree_html = etree.HTML(html.text)
    content = etree_html.xpath('//*[@id="mainBox"]/main/div[2]/div[1]/h4/a/text()')
    for each in content:
        print(each)

    这时候,each里面的数据就是我们想要得到的数据了
    打印结果:

    
    
    
            如何撸一个ArrayList      
    
    

    打印结果却是这个结果,我们把换行和空格去掉

    import requests
    from lxml import etree
    
    html = requests.get("https://blog.csdn.net/it_xf?viewmode=contents")
    # print html.text
    
    etree_html = etree.HTML(html.text)
    content = etree_html.xpath('//*[@id="mainBox"]/main/div[2]/div[1]/h4/a/text()')
    
    for each in content:
        replace = each.replace('\n', '').replace(' ', '')
        if replace == '\n' or replace == '':
            continue
        else:
            print(replace)
    

    打印结果:

    如何撸一个ArrayList 

    相当nice,那么,如果我们要得到所有的博客列表呢
    看图看表达式分析大法

    表达式://*[@id="mainBox"]/main/div[2]/div[1]/h4/a/text()
    其实我们能够很容易发现,main->div[2]其实包含所有文章,只是我们取了main->div[2]->div[1],也就是说我们只是取了第一个而已。所以,其实表达式写出这样,就可以得到所有的文章了

    //*[@id="mainBox"]/main/div[2]/div/h4/a/text()

    再来一次:

    import requests
    from lxml import etree
    
    html = requests.get("https://blog.csdn.net/it_xf?viewmode=contents")
    # print html.text
    
    etree_html = etree.HTML(html.text)
    content = etree_html.xpath('//*[@id="mainBox"]/main/div[2]/div/h4/a/text()')
    
    for each in content:
        replace = each.replace('\n', '').replace(' ', '')
        if replace == '\n' or replace == '':
            continue
        else:
            print(replace)
    
    

    打印结果:

    如何撸一个ArrayList
    Android相机屏幕适配
    Tinker关于clean后准基包消失的解决方案
    Tinker使用指南
    git分支的使用
    如何将Androidstudio中的项目导入到第三方的git托管库中
    遍历矩阵
    从矩阵中取出子矩阵
    AndroidStudio配置OpenCV
    一步一步了解handler机制
    Android常用框架
    Android绘制波浪线
    RxJava系列教程之线程篇(五)
    RxJava系列教程之过滤篇(四)
    RxJava系列教程之变换篇(三)
    RxJava系列教程之创建篇(二)
    RxJava系列教程之介绍篇(一)
    一个例子让你彻底理解java接口回调
    SharedPreferences的用法及指南
    异步加载网络图片带进度
    VideoView加载闪黑屏
    android视频播放vitamio的简单运用
    仿网易新闻分类刷新
    ListViewCheckBox简单实现批量删除
    Android如何高效加载大图
    Android聊天界面实现方式
    抽屉侧滑菜单Drawerlayout-基本使用方法
    android-引导页的实现方式
    Java设计模式--工厂模式的自述
    javaweb学习路线
    getWindow().setFlags()使用说明书
    歪解Activity生命周期-----初学者彻底理解指南

    相当nice,我们得到了所有的文章列表。

    总结

    我们用到了requests获取网页列表,用lxml筛选数据,可以看出python用来在网页上爬取数据确实方便不少,chrome也支持直接在源码中得到表达式xpath,这两个库的内容肯定不止这一点点,还有很多功能等着你们去挖掘。对了,其中在写这篇博客的同时,我发现了一个很重要的问题:我的文章写的太少啦!【逃】

    展开全文
  • python爬取微博评论数据,爬虫之路,永无止境。。(附源码) 今天目标爬取微博任意博文的评论信息 工具使用 开发环境:win10、python3.6 开发工具:pycharm 工具包 :requests,re, time, random,tkinter 项目...

    用python爬取微博评论数据,爬虫之路,永无止境。。(附源码)

    今天目标爬取微博任意博文的评论信息

    工具使用

    开发环境:win10、python3.6
    开发工具:pycharm
    工具包 :requests,re, time, random,tkinter

    项目思路分析

    1.网页版登录拿回cookie值
    2.选取要爬的博文评论信息的网页版网址
    https://weibo.com/3167104922/Kkl7ar83T#comment为例
    3.根据网页版的地址抓包拿回博文唯一的id值(weibo_id)
    4.构造博文手机版评论请求的地址
    f’https://m.weibo.cn/comments/hotflow?id={weibo_id}&mid={weibo_id}&max_id_type=0’
    5.发送请求拿回响应的json数据
    6.max_id和max_id_type的值确定
    7.构造data参数,下次翻页请求要加上参数

    """构造GET请求参数"""
            data = {
                'id': weibo_id,
                'mid': weibo_id,
                'max_id': max_id,
                'max_id_type': max_id_type
            }
    

    8.max_id为上一个包的翻页规律
    9.然后继续解析数据,获取评论信息内容,然后再翻页,一直回调。

    起始地址先进行登录

    https://weibo.com/
    登录之后点开一篇博文,点击评论,点击查看更多评论
    本文以https://weibo.com/3167104922/Kkl7ar83T#comment为例

    在这里插入图片描述
    search搜索weibo_id,构造headers里面的requests url,发送请求拿回weibo_id的值
    在这里插入图片描述
    进入手机版模式进行XHR抓包
    在这里插入图片描述
    在这里插入图片描述
    翻页用到data的参数

    """构造GET请求参数"""
            data = {
                'id': weibo_id,
                'mid': weibo_id,
                'max_id': max_id,
                'max_id_type': max_id_type
            }
    

    先来个代码操作

    本代码需要准备手机版登录后的cookie和博文网页版地址
    在这里插入图片描述

    源码展示:

    
    # !/usr/bin/nev python
    # -*-coding:utf8-*-
    
    
    from datetime import datetime
    from requests_html import HTMLSession
    import re, time
    import tkinter as tk
    import urllib3                      # 解除警告
    urllib3.disable_warnings()
    session = HTMLSession()
    
    
    class WBSpider(object):
    
        def __init__(self):
    
            """定义可视化窗口,并设置窗口和主题大小布局"""
            self.window = tk.Tk()
            self.window.title('微博评论信息采集')
            self.window.geometry('800x600')
    
            """创建label_user按钮,与说明书"""
            self.label_user = tk.Label(self.window, text='请输入要爬取的微博评论的地址:', font=('Arial', 12), width=30, height=2)
            self.label_user.pack()
            """创建label_user关联输入"""
            self.entry_user = tk.Entry(self.window, show=None, font=('Arial', 14))
            self.entry_user.pack(after=self.label_user)
    
            """创建label_passwd按钮,与说明书"""
            self.label_passwd = tk.Label(self.window, text="请输入登陆后的cookie:", font=('Arial', 12), width=30, height=2)
            self.label_passwd.pack()
            """创建label_passwd关联输入"""
            self.entry_passwd = tk.Entry(self.window, show=None, font=('Arial', 14))
            self.entry_passwd.pack(after=self.label_passwd)
    
            """创建Text富文本框,用于按钮操作结果的展示"""
            self.text1 = tk.Text(self.window, font=('Arial', 12), width=85, height=22)
            self.text1.pack()
    
            """定义按钮1,绑定触发事件方法"""
    
            self.button_1 = tk.Button(self.window, text='爬取', font=('Arial', 12), width=10, height=1,
                                      command=self.parse_hit_click_1)
            self.button_1.pack(before=self.text1)
    
            """定义按钮2,绑定触发事件方法"""
            self.button_2 = tk.Button(self.window, text='清除', font=('Arial', 12), width=10, height=1,
                                      command=self.parse_hit_click_2)
            self.button_2.pack(anchor="e")
    
    
    
        def parse_hit_click_1(self):
            """定义触发事件1,调用main函数"""
            user_url = self.entry_user.get()
            pass_wd = self.entry_passwd.get()
            self.main(user_url, pass_wd)
    
    
        def main(self, user_url, pass_wd):
            i = 1
    
            headers_1 = {
                'cookie': pass_wd,
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36'
    
            }
            headers_2 ={
                "referer": "https://m.weibo.cn/status/Kk9Ft0FIg?jumpfrom=weibocom",
                'cookie': pass_wd,
                'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36'
            }
            uid_1 = re.findall('/(.*?)#', user_url)[0]
            uid_2 = uid_1.split('/', 3)[3]
            # print(uid_2)
    
            url_1 = f'https://weibo.com/ajax/statuses/show?id={uid_2}'
            prox = ''
            response = session.get(url_1, proxies={'http': prox, 'https': prox}, headers=headers_1, verify=False).content.decode()
            # print(response)
            weibo_id = re.findall('"id":(.*?),"idstr"', response)[0]
            # print(weibo_id)
            # 构造起始地址
            start_url = f'https://m.weibo.cn/comments/hotflow?id={weibo_id}&mid={weibo_id}&max_id_type=0'
            """
                    2.发送请求,获取响应: 解析起始的url地址
                    :return:
                    """
            prox = ''
            response = session.get(start_url, proxies={'http': prox, 'https': prox}, headers=headers_2, verify=False).json()
    
            """提取翻页的max_id"""
            max_id = response['data']['max_id']
            """提取翻页的max_id_type"""
            max_id_type = response['data']['max_id_type']
    
            """构造GET请求参数"""
            data = {
                'id': weibo_id,
                'mid': weibo_id,
                'max_id': max_id,
                'max_id_type': max_id_type
            }
            """解析评论内容"""
            self.parse_response_data(response, i)
            i+=1
            """参数传递,方法回调"""
            self.parse_page_func(data, weibo_id, headers_2, i)
    
        def parse_page_func(self, data, weibo_id, headers_2, i):
            """
            :return:
            """
    
            start_url = 'https://m.weibo.cn/comments/hotflow?'
            prox = ''
            response = session.get(start_url, proxies={'http': prox, 'https': prox}, headers=headers_2, params=data, verify=False).json()
            """提取翻页的max_id"""
            max_id = response['data']['max_id']
            """提取翻页的max_id_type"""
            max_id_type = response['data']['max_id_type']
            """构造GET请求参数"""
            data = {
                'id': weibo_id,
                'mid': weibo_id,
                'max_id': max_id,
                'max_id_type': max_id_type
            }
            """解析评论内容"""
            self.parse_response_data(response, i)
            i+=1
            """递归回调"""
            self.parse_page_func(data, weibo_id, headers_2, i)
    
        def parse_response_data(self, response, i):
            """
            从响应中提取评论内容
            :return:
            """
            """提取出评论大列表"""
            data_list = response['data']['data']
            # print(data_list)
            for data_json_dict in data_list:
                # 提取评论内容
                try:
                    texts_1 = data_json_dict['text']
                    """需要sub替换掉标签内容"""
                    # 需要替换的内容,替换之后的内容,替换对象
                    alts = ''.join(re.findall(r'alt=(.*?) ', texts_1))
                    texts = re.sub("<span.*?</span>", alts, texts_1)
                    # 点赞量
                    like_counts = str(data_json_dict['like_count'])
                    # 评论时间   格林威治时间---需要转化为北京时间
                    created_at = data_json_dict['created_at']
                    std_transfer = '%a %b %d %H:%M:%S %z %Y'
                    std_create_times = str(datetime.strptime(created_at, std_transfer))
                    # 性别  提取出来的是  f
                    gender = data_json_dict['user']['gender']
                    genders = '女' if gender == 'f' else '男'
                    # 用户名
                    screen_names = data_json_dict['user']['screen_name']
    
                    print(screen_names, genders, std_create_times, texts, like_counts)
                    print()
                except Exception as e:
                    continue
            print('*******************************************************************************************')
            print()
            print(f'*****第{i}页评论打印完成*****')
    
    
        def parse_hit_click_2(self):
            """定义触发事件2,删除文本框中内容"""
            self.entry_user.delete(0, "end")
            self.entry_passwd.delete(0, "end")
            self.text1.delete("1.0", "end")
    
        def center(self):
            """创建窗口居中函数方法"""
            ws = self.window.winfo_screenwidth()
            hs = self.window.winfo_screenheight()
            x = int((ws / 2) - (800 / 2))
            y = int((hs / 2) - (600 / 2))
            self.window.geometry('{}x{}+{}+{}'.format(800, 600, x, y))
    
        def run_loop(self):
            """禁止修改窗体大小规格"""
            self.window.resizable(False, False)
            """窗口居中"""
            self.center()
            """窗口维持--持久化"""
            self.window.mainloop()
    
    
    
    if __name__ == '__main__':
        w = WBSpider()
        w.run_loop()
    
    

    在这里插入图片描述

    仅供学习,爬虫使用须谨慎!

    祝大家学习python顺利!

    展开全文
  • 具体需求:python爬取url不变的网页表格数据。 url:http://gs.amac.org.cn/amac-infodisc/res/pof/fund/index.html 爬取表格所有数据: ![图片说明]...
  • 首先笔者定位为成都,美食类型选的“火锅”,火锅具体类型选的不限,区域选的不限,排序选的智能,如图: ...这一次,笔者用的pyquery来分析网页的,所以我们需要定位到我们所爬取数据的位置,如图:

    首先笔者定位为成都,美食类型选的“火锅”,火锅具体类型选的不限,区域选的不限,排序选的智能,如图:
    在这里插入图片描述
    你也可以选择别的选项,只是注意URL的变化。本文都是按照上述选项爬取的数据。接下来翻页观察一下URL的变化:

    第二页:
    在这里插入图片描述
    第三页:
    在这里插入图片描述
    很容易观察出翻页变化的知识p后面的数字,倒推回第一页,发现一样的显示内容,因此,写一个循环,便可以爬取全部页面。

    但是大众点评只提供了前50页的数据,所以,我们也只能爬取前50页。

    这一次,笔者用的pyquery来分析网页的,所以我们需要定位到我们所爬取的数据的位置,如图:
    在这里插入图片描述
    在具体分析的网页的时候,我震惊了,大众点评的反爬做的太过分了,它的数字,一些文字居然都不是明文显示,而是代码,你还不知道怎么分析它。如图:
    在这里插入图片描述
    很烦的,一些文字又可以显示,一些又用代码表示。一些数字也是,不过好一点的是数字只有9个,只要稍微观察一下,就能发现数字的代码是什么了。这里笔者列出来了。 {‘hs-OEEp’: 0, ‘hs-4Enz’: 2, ‘hs-GOYR’: 3, ‘hs-61V1’: 4, ‘hs-SzzZ’: 5, ‘hs-VYVW’: 6, ‘hs-tQlR’: 7, ‘hs-LNui’: 8, ‘hs-42CK’: 9}。值得注意的是,数字1,是用明文表示的。

    那么,如何用pyquery来定位呢,很简单,你找到你要获取的数据,然后右键→copy→cut selector,你复制到代码里面就OK了。pyquery的具体用法百度既有。

    在这里插入图片描述
    最后,我们获取了火锅50个页面的数据,每页15个数据,一共750家餐厅的数据。
    在这里插入图片描述
    分析

    大众点评已经给出了星级评价,可以看看大致趋势。
    在这里插入图片描述
    准五星商户最多,可能因为大部分食客都习惯给好评,只有实在不满时才会打出低评有关,造成了评级一般不低,但近满分还是蛮少的。

    在本文,我们假设评论数目为饭店的热度,也就是它越火,评论数目越多。
    在这里插入图片描述
    评论数目大多在1000以内,但是高于2000,甚至高于4000也还存在一些,这些饭店应该是一些网红店。以5000为约束,筛选出饭店均为小龙坎、蜀大侠都非常知名的火锅店。那么评论数量和星级有关系吗?看下图:
    在这里插入图片描述
    这里取其评论数平均值,发现对于四星以上商户来说,评论数和星级并不关系,但均比低于四星的饭店销量更好。这说明在四星以上之后,人们选择差别不大,但一般不愿意接受评论太差的饭店。

    对于笔者这样的学生党来说,影响较大还有人均消费情况。
    在这里插入图片描述
    成都的火锅店人均消费大部分都在50-100的区间内,高于150的也有一些。对于笔者来讲,吃一顿火锅,人均在50-100是可以接受的,高于100,就要低头看看钱包了()。那扩展看,人均消费和星级、评论数量有关系吗?
    在这里插入图片描述
    上图是人均消费和星级的关系,看起来并无任何关系,那说明一些口碑好的火锅店,其实人均也不贵。下面看看人均和评论数目的关系吧。
    在这里插入图片描述
    通过比较,发现评论数目低于500,人均在50-100区间是最多的。当然这肯定和评论数量、人均消费本身集中于这一阶段有关。

    吃火锅,一家店的生意好坏,肯定还和它的特色菜有关,笔者通过jieba分词,将爬取到的推荐菜做了一个词云图,如下。
    在这里插入图片描述
    笔者最爱的牛肉是特色菜之最啊,尤其是麻辣牛肉,只要去吃火锅,都要来上一份,其次是毛肚、虾滑、鹅肠等等。

    接下来是大家都关心的,口味、环境和服务的情况。
    在这里插入图片描述
    三者得分大多都是集中在8.0-9.2这一阶段,笔者认为,低于7.5分的饭店还是不要去尝试了。同时,星级评价应该也是由这三者得分产生的。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    果然如预想的一向,星级评价越好,它在口味、环境和服务的得分越高。那么口味,环境,服务得分与评论数量,平均价格有关系吗?

    在这里插入图片描述
    如图所看,并无什么直接关系,但是我们发现口味、环境和服务三者之间存在着非常好的线性关系,于是单独拿出来画了一个较大的图。
    在这里插入图片描述
    我们并且拟合了线性关系,由于三星商户只有一家,它的情况较为特殊之外,其他星级在口味、环境和服务的关系拟合中保持的相当一致,这也证明我们的猜想,这些变量之间存在线性关系。鉴于笔者本文最大的目的是做推荐,于是,我们进行了K-means聚类,这里取K为3,并且把星级转换为数字,五星对应5分,准五星对应4.5分,以此类推。最终得到了三类,通过作图,看看聚类情况如何吧。
    在这里插入图片描述
    和我们想要的结果一致,在口味、环境、服务和星级上得分越高,我们就越推荐。然而推荐的店铺还是好多,能不能在集中一些呢?于是通过限制评论数量、人均消费和特色菜来进行推荐。由于笔者喜欢人少,便宜还有牛肉的店铺,这里得到了如下的结果:
    在这里插入图片描述
    代码

    import time import requests from pyquery import PyQuery as pq import
    pandas as pd ​ headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0;
    Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
    Chrome/68.0.3440.106 Safari/537.36’} ​ def restaurant(url):
    # 获取网页静态源代码
    try:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
    return response.text
    except Exception:
    return None ​ name=[] url = [] star = [] comment = [] avg_price = [] taste = [] environment = [] services = [] recommend =
    [] ​ num = {‘hs-OEEp’: 0, ‘hs-4Enz’: 2, ‘hs-GOYR’: 3, ‘hs-61V1’: 4,
    ‘hs-SzzZ’: 5, ‘hs-VYVW’: 6, ‘hs-tQlR’: 7, ‘hs-LNui’: 8, ‘hs-42CK’: 9}
    def detail_number(htm):
    try:
    a = str(htm)
    a = a.replace(‘1<’, ‘<’)
    a = a.replace(’.’, ‘’)
    b = pq(a)
    cn = b(‘span’).items()
    number = ‘’
    for i in cn:
    attr = i.attr(‘class’)
    if attr in num:
    attr = num[attr]
    number = number + str(attr)
    number = number.replace(‘None’, ‘’)
    except:
    number = ‘’
    return number ​ def info_restaurant(html):
    # 获取饭店的名称和链接
    doc = pq(html)
    for i in range(1,16):
    #获取饭店名称
    shop_name = doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > div.tit > a:nth-child(1) >
    h4’).text()
    if shop_name == ‘’:
    break
    name.append(shop_name)
    #获取饭店链接
    url.append(doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.pic > a’).attr(‘href’))
    try:
    star.append(doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > div.comment >
    span’).attr(‘title’))
    except:
    star.append("")
    #获取评论数量
    comment_html = doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > div.comment > a.review-num > b’)
    comment.append(detail_number(comment_html))
    #获取人均消费
    avg_price_html = doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > div.comment > a.mean-price > b’)
    avg_price.append(detail_number(avg_price_html))
    #获取口味评分
    taste_html = doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > span > span:nth-child(1) > b’)
    taste.append(detail_number(taste_html))
    #获取环境评分
    environment_html = doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > span > span:nth-child(2) > b’)
    environment.append(detail_number(environment_html))
    #获取服务评分
    services_html = doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > span > span:nth-child(3) > b’)
    services.append(detail_number(services_html))
    #推荐菜,都是显示三道菜
    try:
    recommend.append(doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > div.recommend >
    a:nth-child(2)’).text()+str(’,’)+
    doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > div.recommend >
    a:nth-child(3)’).text()+str(’,’)+
    doc(’#shop-all-list > ul > li:nth-child(’+str(i)+’) > div.txt > div.recommend >
    a:nth-child(4)’).text())
    except:
    recommend.append("") for i in range(1,51):
    print(‘正在获取第{}页饭店信息’.format(i))
    hotpot_url = ‘http://www.dianping.com/chengdu/ch10/g110p’+str(i)+’?aid=93195650%2C68215270%2C22353218%2C98432390%2C107724883&cpt=93195650%2C68215270%2C22353218%2C98432390%2C107724883&tc=3’
    html = restaurant(hotpot_url)
    info_restaurant(html)
    print (‘第{}页获取成功’.format(i))
    time.sleep(12) ​ shop = {‘name’: name, ‘url’: url, ‘star’: star, ‘comment’: comment, ‘avg_price’: avg_price, ‘taste’: taste,
    ‘environment’: environment, ‘services’: services, ‘recommend’:
    recommend} shop = pd.DataFrame(shop, columns=[‘name’, ‘url’, ‘star’,
    ‘comment’, ‘avg_price’,‘taste’, ‘environment’, ‘services’,
    ‘recommend’]) shop.to_csv(“shop.csv”,encoding=“utf_8_sig”,index =
    False)

    了解更多分析及数据抓取可查看:
    http://cloud.yisurvey.com:9081/html/bfd0c1a1-ea90-4ed6-9a2c-1da4cd72391c.html
    本文转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请联系我们删除处理。
    特别说明:本文旨在技术交流,请勿将涉及的技术用于非法用途,否则一切后果自负。如果您觉得我们侵犯了您的合法权益,请联系我们予以处理。

    展开全文
  • python爬取数据多页

    千次阅读 2019-12-18 11:10:33
    然后找到我们要爬取网页,复制链接注意有些网站反爬虫,我们要加入请求头 观察网页结构,找出相同点,此网页具有相同的class名v-pw,我们要取他里面img的src和文字 如图:我们就可以取到src和里面的文字了 取到...

    第一次写爬虫,记录一下
    首先import引入
    在这里插入图片描述
    然后找到我们要爬取的网页,复制链接注意有些网站反爬虫,我们要加入请求头
    在这里插入图片描述
    观察网页结构,找出相同点,此网页具有相同的class名v-pw,我们要取他里面img的src和文字
    在这里插入图片描述
    如图:我们就可以取到src和里面的文字了
    在这里插入图片描述
    取到以后插入数据库:
    在这里插入图片描述
    在这里插入图片描述
    完整代码:

    import pymysql
    import requests
    from bs4 import BeautifulSoup
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    page = requests.get('https://www.xinshipu.com/s/d0a1b3b4b2cbb2cbc3fbb4f3c8ab/', headers = headers)
    db = pymysql.connect('localhost', 'root', 'root', 'blog', charset='utf8')
    cursor = db.cursor()
    page.encoding = 'utf8'
    soup = BeautifulSoup(page.text, "html.parser")
    num = -1
    pageNum = 1
    nameArr = []
    imgArr = []
    for index in range(10):#有10页数据,循环获取,
        pageNum = pageNum+1
        print('https://www.xinshipu.com/s/d0a1b3b4b2cbb2cbc3fbb4f3c8ab/?page='+str(pageNum))
        pages = requests.get('https://www.xinshipu.com/s/d0a1b3b4b2cbb2cbc3fbb4f3c8ab/?page='+str(pageNum), headers=headers)
        db = pymysql.connect('localhost', 'root', 'root', 'blog', charset='utf8')
        cursor = db.cursor()
        pages.encoding = 'utf8'#网页编码,有些网页是gb2312 等
        soups = BeautifulSoup(pages.text, "html.parser")
        # vegeAlls = soups.findAll("div", attrs={"class", "new-menu-list"})
    
        for items in soups.find_all("div", class_="v-pw"):
            imgs = items.find("img")['src']
            print(imgs)
            texts = items.find("div").get_text()
            print(texts.replace(" ",""))
            nameArr.append(texts.replace(" ",""))
            imgArr.append(imgs)
            num = num + 1
            print(num)
            cursor.execute(
                    "insert into food(cid,foodName,foodImg) values(%s, %s,%s)",
                    (num+1,nameArr[num],imgArr[num]))#插入数据库,food是表名  values(%s, %s,%s)占位符
    
            db.commit()//提交到数据库
    cursor.close()//关闭游标
    db.close()//关闭数据库
    
    展开全文
  • 1.java是块砖哪里需要哪里搬,由于公司python人员紧张,老板让我去学python,做点python任务。...先爬取一下简单网页吧,随便搜点文章,照搬运行一下可以的。网页爬起来很轻松。去拿百度,淘宝数据很容易。...
  • 笔者之前在慕课学习Python网络爬虫与信息提取时,老师并未讲解如何爬取网页的动态加载数据,之后通过观看其他教学视频学会了如何爬取网页动态数据,下面用一个实例来记录一下爬取动态网页的步骤。 实例:爬取药监...
  • 我们之前爬取得信息都是在一页内,并且只是这层的数据,那么如果我们要爬取多页的、并且要在内层爬取信息怎么办,就是要点进某一个房屋信息再爬取 以上我们便得到了结果。 代码中需要解释的内容: 1、每一...
  • python爬虫教程:实例讲解Python爬取网页数据

    万次阅读 多人点赞 2020-03-04 21:59:46
    这篇文章给大家通过实例讲解了Python爬取网页数据的步骤以及操作过程,有兴趣的朋友跟着学习下吧。 一、利用webbrowser.open()打开一个网站: >>> import webbrowser >>> webbrowser.open('...
  • python爬取多网页表格并保存为csv

    千次阅读 2019-04-23 14:54:40
    print(ui) # 一行数据 onetable.append(ui)#整张表格 # print("start onetable:") # print(onetable) save_contents(file_names[i], onetable) # print("end") # exit() yield onetable # 保存资源 def ...
  • python 爬取拉钩数据

    千次阅读 2019-03-15 09:19:52
    采用python爬取拉钩数据,有很方法可以爬取,我采用的是通过Request库获取页面,然后通过BeautifulSoup解析html,获取到想要的信息,我只爬取到拉钩页面的基础数据信息,详细信息没有深入去爬取。 数据页面 首先...
  • python 爬取所有页面的对应数据

    千次阅读 2018-11-06 14:45:37
    一般来说不同页码最后page=或者p 等等,只需要转化一下后面对应的数值即可,或者从尾对应URL找到最后一,也就是总页数即可 案例一: #!/usr/bin/env python # -*- coding: utf-8 -*- import pymysql # 导入...
  • 利用Python爬取京东任意商品数据 今天给大家展示爬取京东商品数据 首先呢还是要分思路的,我分为以下几个步骤: 第一步:得到搜索指定商的url 第二步:获得搜索商品列表信息 第三步:对得到的商品数据进行分析...
  • python爬取网页表格数据,供大家参考,具体内容如下 from bs4 import BeautifulSoup import requests import csv import bs4 #检查url地址 def check_link(url): try: r = requests.get(url) r.raise_for_...
  • 使用 Python 爬取网页数据

    千次阅读 2019-04-16 15:07:00
    1. 使用 urllib.request 获取网页 urllib 是 Python 內建的 HTTP 库, 使用 urllib 可以只需要很简单的步骤就能高效采集数据; 配合 Beautiful 等 HTML 解析库, 可以编写出用于采集网络数据的大型爬虫; 注: 示例代码...
  • 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者...本文都是按照上述选项爬取数据。接下来翻页观察一下URL的变化: 第二: 第三: 很容易观察出翻页变化的知识p后面的数字,...
  • PYTHON爬取汽车之家数据

    千次阅读 2020-01-17 22:30:56
    使用BeautifulSoup以及正则表达式实现爬取汽车之家数据
  • python如何爬取动态网页数据

    千次阅读 2018-06-16 12:43:52
      但大家也知道,现在的网页大多都是动态的了,即数据是通过js渲染加载的,静态网页那一套在这根本不讨好,所以,掌握爬取动态加载数据的方法就显得十分必要了。   下面以爬取中国电影网中国票房排行前500为例...
  • python网页爬取多页爬取

    千次阅读 2019-09-20 20:47:54
    获取多页信息 截取以学号尾数开始的10个列表页 ''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助, 群里还有不错的视频学习教程和PDF电子书! ''' listUrl...
  • Python爬取淘宝商品详情页数据

    万次阅读 2018-01-06 23:14:32
    在讲爬取淘宝详情页数据之前,先来介绍一款 Chrome 插件:Toggle JavaScript (它可以选择让网页是否显示 js 动态加载的内容),如下图所示: 当这个插件处于关闭状态时,待爬取的页面显示的数据如下: 当这个...
  • Python爬取和分析旅游数据

    千次阅读 2018-07-30 21:47:35
    01 数据爬取   最近几天朋友圈被大家的旅行足迹刷屏了,惊叹于那些把全国所有省基本走遍的朋友。与此同时,也萌生了写一篇旅行相关的内容,本次数据来源于一个对于爬虫十分友好的旅行攻略类网站:马蜂窝。   1...
  • python爬取豆瓣电影json数据

    千次阅读 2019-01-17 17:59:46
    由于豆瓣里的电影都有专属的id,获取到id后可以进一步爬取其他页面的内容。 首先来到主界面(https://movie.douban.com)观察网页: 点击“选电影”进入需要爬取的界面: 打开Chrome开发模式,并下拉网页观察新生成的...
  • python爬取动态网页

    千次阅读 2018-05-31 13:55:24
    还记得在之前一篇python开发电影查询系统(一)—python实现后台数据中,对电影的下载地址无法进行爬取,原因是下载地址在网页源码中无法查看,而是被js隐藏起来了。所以在爬取时,我在文章中写道 现在,我们找到...
  • 爬虫程序是DT (Data Technology,数据技术)收集信息的基础,程序员爬取目标网站的资料后,就可以分析和建立应用了。我们关心的是科技如何给大家带来实效,进而实现目标和理想,不能应用的技术称为魔术,只能用于表演...
  • 可是它能够使用都非常的范畴,并且效率高的可怕,Python的使用范畴非常,现在国内越来越的人学习Python,可是学会后发现仍然爬不了数据,下面芝麻代理告诉大家怎么可以轻松爬取数据。1、学习Python包并完成...
  • Python爬取网页表格数据并写入Excel import requests from bs4 import BeautifulSoup import xlwt #请求headers 模拟谷歌浏览器访问 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Apple...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,005
精华内容 12,802
关键字:

python爬取多页网页数据

python 订阅