澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:记一次Python爬虫分享,

天行健,君子以自强不息;地势坤,君子以厚德载物!

实验目的:获取糗事百科网页上的段子

一、爬虫的目标

网址:http://www.gdgpo.gov.cn/queryMoreInfoList/channelCode/0008.html

这是广东省政府采购网公布的中标公告,网站如下:

澳门新浦京娱乐场网站 1

网页截图

我们要进入具体的公告中,爬一下内容:

澳门新浦京娱乐场网站 2

我们要爬红色框里的内容

将红色框里的数据整理表格形式。

由于电商网站的数据的实时性要求,数据分析时一般直接从网页爬取。因此使用爬虫的方法显得十分重要。R作为数据分析的软件,可以直接对爬取的数据进行后续处理,加上上手快的特点,是电商网站数据爬取和分析的好工具。


思路

澳门新浦京娱乐场网站 3

二、分析网站

具体爬虫之前分析一下网站,决定如何进行爬虫。

下面以​ 简单分享下使用Rcurl对网站进行数据爬取的过程。

好了废话不多说,正式进入主题,前段时间应朋友的请求,爬取了某铝业网站上的数据。刚开始呢,还是挺不愿意的(主要是自己没有完整的爬取过网上的数据哎,即是不自信),但是在兄弟伙的面前不能丢脸卅,硬起头皮都要上,于是乎答应了他,好吧~~~~

1)分析各个页面间的网址规律,构造网址变量

对应的网址:https://www.qiushibaike.com/

接下来,对网址进行分析,此时我只获得了段子的第一个页面,往下拖动,可以看到段子还有很多页,如图所示

澳门新浦京娱乐场网站 4

糗事百科.png

那么,怎么样才能自动爬取第一页以外的其他页面呢?

单击“2”、“3”...."下一页",观察网址的变化。
鼠标点击“2”之后,发现网址由 https://www.qiushibaike.com/ 变为 https://www.qiushibaike.com/8hr/page/2/
继续点击“3”,发现网址变成了 https://www.qiushibaike.com/8hr/page/3/
觉得还不能得出规律的话可以继续往下点几页观察

可以发现,获取第几页是通过URL地址识别的,即通过GET请求的

澳门新浦京娱乐场网站 5

通过GET请求获取下一页.png

观察网址的变化,发现有个字段 page,“/”之后的数字对应就是页数,由此推测 page 字段后面的数字代表的是获取第几页的段子内容,将网址中的数字3 改成11 进行验证,即网址变为https://www.qiushibaike.com/8hr/page/11/,观察页面结果,可以看到页面展示的是第11页的段子内容

澳门新浦京娱乐场网站 6

手工切换网址观察内容变化.png

由此可以想到使用 for 循环实现,每页段子内容读取完后,数字(页数)加1,即自动切换到下一页

封面

翻页

留意一下,我们进入该网站后,点击跳转到第2页或别的页,可以发现浏览器的网址框中的网址是一样的。我们用控制台看一下,可以发现,页数的跳转是用JavaScript处理的,如下图:

澳门新浦京娱乐场网站 7

控制台查看

所以,我们不能直接借助网址跳到不同的页数去,我想到的办法是借助Python的selenium包。它可以借助浏览器,模拟鼠标操作,待JavaScript处理完后再获取网页源码。

澳门新浦京娱乐场网站 8


2)构建自定义函数,用来实现爬取网页上的段子,包括:用户昵称、段子内容
  • 模拟浏览器访问,观察网页源代码,将用户昵称和段子内容的格式写成正则表达式
  • 用正则表达式提取出用户昵称和段子内容(获取多少内容,即页数由自己决定)
  • 通过 for 循环分别遍历用户昵称和段子内容

</br>

标题链接

通过看网页源码,其实发现源码是很清晰的,可以直接爬到链接。

澳门新浦京娱乐场网站 9

网页源码

这个网址看得出来是个相对路径,我们进去之后可以在浏览器看到完整路径。

澳门新浦京娱乐场网站 10

完整的网址

首先需要在Rgui里安装需要的软件包

 我们的爬取目标:

3)通过 for 循环获取各页URL链接,每页分别调用一个函数

具体实现代码如下:

# -*- coding: utf-8 -*-
# __author__ = 'Carina'    

import re
import urllib.request


def getcontent(qsbkurl, page):
    # 模拟成浏览器
    headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0")
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    # 将opener 设为全局变量
    urllib.request.install_opener(opener)
    data = urllib.request.urlopen(qsbkurl).read().decode('utf-8')
    # print(data)
    # 构建对应用户提取的正则表达式        
    userpat = '<h2>*(.*?)</h2>'
    # 构建段子内容提取的正则表达式
    contentpat = '<div class="content">(.*?)</div>'
    # 寻找出所有用户
    userlist = re.compile(userpat, re.S).findall(data)    # re.S表示使.匹配包括换行在内的所有字符
    # print(userlist)
    # 寻找出所有的内容
    contestlist = re.compile(contentpat, re.S).findall(data)
    # print(contestlist)
    x = 1
    # 通过for循环遍历段子内容并将内容分别付给对应的变量
    for content in contestlist:
        content = content.replace("n", "")               # 替换换行符
        content = content.replace("", "")      #可根据需求增减替换字符
        content = content.replace("", "")
        # 用字符串作为变量名,先将对应字符赋给一个变量
        neilong = "content"   str(x)
        # 通过exec()函数实现用字符串作为变量名并赋值
        exec(neilong   '=content')
        x  = 1
    y = 1
    # 通过for循环遍历用户,并输出该用户对应的内容
    for user in userlist:
        user = user.replace("n","")
        neilong = "content"   str(y)
        print("第"   str(page)   "页的用户是:"   user)
        print("段子内容是:")
        exec("print("  neilong  ")")
        print("n")
        y  = 1

# 分别获取各页的段子,通过for循环可以获取多页
for i in range(1, 4):      # 爬取页数自己设定
    qsbkurl = "https://www.qiushibaike.com/8hr/page/"   str(i)
    getcontent(qsbkurl, i)

具体内容

通过看网页源码,要爬的内容在源码中也都有了。

澳门新浦京娱乐场网站 11

网页源码

require("RCurl")

怎么定位用户昵称和段子内容?

网页鼠标右键---查看源代码,接着可根据页面上的昵称和内容去搜索(Ctrl F),方便快读定位,由此可得出用户昵称从<h2>...</h2>标签去取,段子内容从<div class="content">.....</div>取,加以整理得出正则表达式

澳门新浦京娱乐场网站 12

定位元素.png

结合网页和输出结果,看到内容是一致的,数据爬取成功

澳门新浦京娱乐场网站 13

第一页结果.png

澳门新浦京娱乐场网站 14

第三页结果.png

总结

通过爬虫进行自动化爬取,可以省下很多时间,比如要通过复制粘贴的方式,几百页的数据耗费的精力就非常大了,另外也有一些网站是不允许复制粘贴的,碰到时会很头疼,只能借助其他办法
采用爬虫的方式,也可以将数据取出来存到数据库方便使用

若糗事百科的网页代码结构发生了变化,那么代码中的URL网址和正则表达式都要进行相应的调整,否则无法爬取。

写给自己的话

学习爬虫,要学会写爬虫的这一套方法并灵活运用
(基本思路一致,具体细节具体分析)

注:本文主要参照:手把手 | 教你爬下100部电影数据:R语言网页爬取入门指南(http://mp.weixin.qq.com/s/mIL-p2q7Jp-dhkXkDIrdHQ)

小结

小结一下,这次的爬虫难点主要在于翻页,中间过程要爬的标题链接和最终要爬的具体内容,都可以用一般的爬虫方法得到。

所以,爬虫的思路是:

  1. 借助selenium实现翻页;
  2. 翻页过程中把标题链接爬下来;
  3. 循环进入各个公告,把要爬的具体数据爬下来。

require("rjson")

1、总共63页,每页有十几条的链接


三、编程

先把要引用的包引用进来:

import urllib.request
import re
from selenium import webdriver
import csv

require(stringr)

澳门新浦京娱乐场网站 15

一入爬虫深似海,从此复制是路人。

实现翻页

首先,使用selenium打开网站。

url = 'http://www.gdgpo.gov.cn/queryMoreInfoList/channelCode/0008.html'

browser = webdriver.Firefox()   # 使用Firefox浏览器
browser.set_page_load_timeout(5)
browser.get(url)    # 打开指定网站
browser.maximize_window()   # 最大化浏览器窗口

注意:使用selenium打开浏览器时,需要在电脑上装一个浏览器的驱动。网页会跳转提示,根据提示下载安装即可!

然后,锁定源码中<下一页>按钮的位置。<下一页>按钮的标签比较难以确定位置,在这里我使用find_element_by_xpath()函数,来确定位置。至于该按钮的xpath,我们可以借助chrome直接复制出来。

澳门新浦京娱乐场网站 16

借助chrome浏览器控制台复制xpath

完善修改代码:

url = 'http://www.gdgpo.gov.cn/queryMoreInfoList/channelCode/0008.html'

browser = webdriver.Firefox()   # 使用Firefox浏览器
browser.set_page_load_timeout(5)
browser.get(url)    # 打开指定网站
browser.maximize_window()   # 最大化浏览器窗口

# 经对比发现,第一页和其他页中的<下一页>按钮的xpath不一致
# 首先点击第一页中的<下一页>按钮
browser.find_element_by_xpath("//*[@id='contianer']/div[3]/div[2]/div[3]/div/form/a[8]/span").click()

# 这里点击其余页中的<下一页>按钮
for i in range(1):  # 写一个循环,翻多少页就循环多少次
    browser.find_element_by_xpath("//*[@id='contianer']/div[3]/div[2]/div[3]/div/form/a[10]/span").click()

注意:第一页和其余页的<下一页>按钮的xpath不一样,需要留意一下!

require(XML)

2、爬取连接里面的数据(主要有产品名称、规格、合同、华东市场、华南市场、西南市场、中原市场、产品报价时间)

都说在这一行混,多多少少都要会点爬虫,毕竟自己动手丰衣足食,本文记录小鑫第一次练习爬虫的过程。仅供参考,欢迎各路朋友指点。(E-mail:rockyxin@rockyxin.com)

爬取标题链接

首先,写一个爬取标题链接的函数:

# 获取标题链接
def getConn(html):
    # 利用正则表达式匹配网页内容找到标题地址
    reg = r'(/showNotice/id/[^s]*?html)'
    imgre = re.compile(reg)
    imglist = re.findall(imgre, str(html))  # 找出匹配的内容,即链接
    return imglist

这只是一个函数,我们结合之前写好的翻页的代码,爬一下前两页的标题链接,看看效果:

# 获取标题链接
def getConn(html):
    # 利用正则表达式匹配网页内容找到标题地址
    reg = r'(/showNotice/id/[^s]*?html)'
    imgre = re.compile(reg)
    imglist = re.findall(imgre, str(html))  # 找出匹配的内容,即链接
    return imglist

url = 'http://www.gdgpo.gov.cn/queryMoreInfoList/channelCode/0008.html'

browser = webdriver.Firefox()   # 使用Firefox浏览器
browser.set_page_load_timeout(5)
browser.get(url)    # 打开指定网站
browser.maximize_window()   # 最大化浏览器窗口

list = []
link = getConn(browser.page_source) # 爬取标题链接,browser.page_source是网页源代码
list.append(link)

# 经对比发现,第一页和其他页中的<下一页>按钮的xpath不一致
# 首先点击第一页中的<下一页>按钮
browser.find_element_by_xpath("//*[@id='contianer']/div[3]/div[2]/div[3]/div/form/a[8]/span").click()
link = getConn(browser.page_source)
list.append(link)

for item in list:
    for link in item:
        print(link)

运行结果为:

澳门新浦京娱乐场网站 17

爬取标题链接

#得到网页地址,并将其转换成html源码

澳门新浦京娱乐场网站 18

文末有源代码及数据。

爬取具体的目标数据

前文已经说了,每一篇公告的网址都是由http://www.gdgpo.gov.cn加上爬到的标题链接组合起来。简单来说,我们可以通过直接输入网址访问每一篇公告。

对于这种情况,我选择使用urllib就足够了。毕竟selenium还需要打开浏览器,相对来说比较麻烦的,而且进入的网页如果有数百上千个,总不好在浏览器打开数百上千个标签页吧!这样做,费时不讨好。

所以,爬取具体的目标数据,我们使用urllib就足够了。

首先,写一个获取网页源码的函数:

# 获取网页源代码
def getHtml(url):
    page = urllib.request.urlopen(url)
    html = page.read()
    html = html.decode('utf8')  # 网页源码有中文,转码匹配
    return html

接下来,我们把翻页和爬取标题链接封装成一个函数,将标题链接存进一个数组返回:

# 获取标题链接
def getConn(html):
    # 利用正则表达式匹配网页内容找到标题地址
    reg = r'(/showNotice/id/[^s]*?html)'
    imgre = re.compile(reg)
    imglist = re.findall(imgre, str(html))  # 找出匹配的内容,即链接
    return imglist

# 使用浏览器翻页抓取标题链接
def getList(url):
    list = []
    browser = webdriver.Firefox()   # 使用Firefox浏览器
    browser.set_page_load_timeout(5)
    browser.get(url)    # 打开指定网站
    browser.maximize_window()   # 最大化浏览器窗口

    link = getConn(browser.page_source) # 爬取标题链接,browser.page_source是网页源代码
    list.append(link)

    # 经对比发现,第一页和其他页中的<下一页>按钮的xpath不一致
    # 首先点击第一页中的<下一页>按钮
    browser.find_element_by_xpath("//*[@id='contianer']/div[3]/div[2]/div[3]/div/form/a[8]/span").click()
    link = getConn(browser.page_source)
    list.append(link)

    # 这里点击其余页中的<下一页>按钮
    for i in range(1):  # 写一个循环,翻多少页就循环多少次
        browser.find_element_by_xpath("//*[@id='contianer']/div[3]/div[2]/div[3]/div/form/a[10]/span").click()
        link = getConn(browser.page_source)
        list.append(link)
    return list

通过上述函数,获取标题链接,写一个函数,爬取具体数据,存进csv文件:

# 根据标题链接,进入页面爬取所需数据
def getData(url):
    list = getList(url) # 获取标题链接
    str1 = 'http://www.gdgpo.gov.cn'
    for item in list:
        for link in item:
            data = []
            url_link = str1 link    # 拼接网址
            html_link = getHtml(url_link)

            # 正则表达式匹配采购项目名称
            xre = re.compile(r'(] [^<] [^>] [^;] [^&] [^;] ;([^&] )'  # 匹配法人代表
                             r'[^>] [^<] [^>] [^;] [^&] [^;] ;([^&] )') # 匹配地址
            try:
                data2 = re.search(yre, str(html_link)).group(3)
                data3 = re.search(yre, str(html_link)).group(4)
                data4 = re.search(yre, str(html_link)).group(5)
                data.append(data2)
                data.append(data3)
                data.append(data4)
            except:
                pass

            # 数据已经存进data,用a 模式打开csv文件,可以添加data数据进去,不覆盖原数据
            with open("yang.csv", "a ", newline="") as datacsv:
                # dialect为打开csv文件的方式,默认是excel,delimiter="t"参数指写入的时候的分隔符
                csvwriter = csv.writer(datacsv, dialect=("excel"))
                # csv文件插入一行数据,把下面列表中的每一项放入一个单元格(可以用循环插入多行)
                csvwriter.writerow(data)

注意:写正则表达式的时候,有些地方是需要匹配中文的,在获取网页源码函数里面,我已经转码为utf8,所以写正则表达式的时候要把中文转成Unicode编码。

另外,这里要多说一句,我的正则表达式真的是渣渣水平,所以写得很长很不好看很不舒服。各位看官要是看不下去了,自己修改一下。[捂脸]

至此,这个函数写完了,调用这个函数就可以把数据爬下来了,可以得到一个csv文件,我们可以用Excel打开,就是表格的形式。

url = ""

3、爬取的数据存为CSV格式

</br>

完整版代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@File:yang.py
@Time:2017/8/17 23:20
@Author:lgsen
"""

import urllib.request
import re
from selenium import webdriver
import csv

# 获取网页源代码
def getHtml(url):
    page = urllib.request.urlopen(url)
    html = page.read()
    html = html.decode('utf8')  # 网页源码有中文,转码匹配
    return html

# 获取标题链接
def getConn(html):
    # 利用正则表达式匹配网页内容找到标题地址
    reg = r'(/showNotice/id/[^s]*?html)'
    imgre = re.compile(reg)
    imglist = re.findall(imgre, str(html))  # 找出匹配的内容,即链接
    return imglist

# 使用浏览器翻页抓取标题链接
def getList(url):
    list = []
    browser = webdriver.Firefox()   # 使用Firefox浏览器
    browser.set_page_load_timeout(5)
    browser.get(url)    # 打开指定网站
    browser.maximize_window()   # 最大化浏览器窗口

    link = getConn(browser.page_source) # 爬取标题链接,browser.page_source是网页源代码
    list.append(link)

    # 经对比发现,第一页和其他页中的<下一页>按钮的xpath不一致
    # 首先点击第一页中的<下一页>按钮
    browser.find_element_by_xpath("//*[@id='contianer']/div[3]/div[2]/div[3]/div/form/a[8]/span").click()
    link = getConn(browser.page_source)
    list.append(link)

    # 这里点击其余页中的<下一页>按钮
    for i in range(1):  # 写一个循环,翻多少页就循环多少次
        browser.find_element_by_xpath("//*[@id='contianer']/div[3]/div[2]/div[3]/div/form/a[10]/span").click()
        link = getConn(browser.page_source)
        list.append(link)
    return list

# 根据标题链接,进入页面爬取所需数据
def getData(url):
    list = getList(url) # 获取标题链接
    str1 = 'http://www.gdgpo.gov.cn'
    for item in list:
        for link in item:
            data = []
            url_link = str1 link    # 拼接网址
            html_link = getHtml(url_link)

            # 正则表达式匹配采购项目名称
            xre = re.compile(r'(] [^<] [^>] [^;] [^&] [^;] ;([^&] )'  # 匹配法人代表
                             r'[^>] [^<] [^>] [^;] [^&] [^;] ;([^&] )') # 匹配地址
            try:
                data2 = re.search(yre, str(html_link)).group(3)
                data3 = re.search(yre, str(html_link)).group(4)
                data4 = re.search(yre, str(html_link)).group(5)
                data.append(data2)
                data.append(data3)
                data.append(data4)
            except:
                pass

            # 数据已经存进data,用a 模式打开csv文件,可以添加data数据进去,不覆盖原数据
            with open("yang.csv", "a ", newline="") as datacsv:
                # dialect为打开csv文件的方式,默认是excel,delimiter="t"参数指写入的时候的分隔符
                csvwriter = csv.writer(datacsv, dialect=("excel"))
                # csv文件插入一行数据,把下面列表中的每一项放入一个单元格(可以用循环插入多行)
                csvwriter.writerow(data)

# 主程序
if __name__=="__main__":
    url = 'http://www.gdgpo.gov.cn/queryMoreInfoList/channelCode/0008.html'
    getData(url)

doc = getURL(url)


准备 | 必要的工具

chrome浏览器 SelectorGadget插件。

用来获得网页中某些部分的相关标签,若不懂HTML和CSS,强烈安利这个插件。懂HTML和CSS的话,略过,用不着我来教了。

安装插件之后,在网页的右上角就会出现图标,在使用的时候单机一下就可以。

点击之后,鼠标移动到网页上就会出现一系列的变化,再单机想要知道标签的地方,比如标题部分:

澳门新浦京娱乐场网站 19

截图1

可以看到,虽然选中了标题,但同时公司名称和薪资也同样被选中了,想要取消选中公司名称很简单,单机一下公司名称所在的位置就可以了,如下图

澳门新浦京娱乐场网站 20

截图2

至于不选中薪资,在这里没法做到,不过没关系,在后面可以进行清理。

当然,也可以通过右键查看网页源代码或者右键审查,可以查看标签,这种方式显然需要一点HTML基础。

澳门新浦京娱乐场网站 21

截图3

至于R的操作环境,推荐使用RStudio,没有原因,它就是非常好……

</br>

四、总结

我不是专门写爬虫的,编程水平也不高,看我的代码就知道了[捂脸]。就是这次爬虫用到了selenium这个包,感觉有点意思,就分享一下过程。

很多东西都是在网络上现查现用,并没有认真去理解。甚至有的代码是复制过来的,变量名都没改,如imglist,大家看看笑笑就好了。就爬虫而言,这次的难度并不高,感觉就新手练手的程度。毕竟,我就是个新手嘛!

最后,想提一下,其实有些公告里,中标供应商是有好几个,并不只有一个,我写的代码只是爬取了第一个,大家有兴趣可以自己去解决这个问题。重在学习嘛!

txt = htmlParse(doc, asText = TRUE)

 一、网页源代码分析:

开始 | 准备爬取

网上有看到爬知乎、爬微博、爬智联招聘、爬拉勾网,各种网站的爬取方式略微不同,小鑫在找了几个招聘的网站之后,发现BOSS直聘的网址比较简单,页面源码也不复杂,因此,就从这里开始。

先加载需要的包:

library(xml2)
library(rvest)

</br>

print(txt)

1、分析网站每页的网址

首先,分析网址

小鑫搜索的是深圳的数据分析岗位,网址如下:
https://www.zhipin.com/job_detail/?query=数据分析&scity=101280600&source=2

这里似乎发现不了规律,再点开下一页呢:https://www.zhipin.com/c101280600/h_101280600/?query=数据分析&page=2&ka=page-2

其中个地方引起了我注意:page=2ka=page-2,小鑫试了一下,只要改变这个数字,就能控制翻页,这个网站最多只能显示30页,每页15个。所以,不同页,除了数字不同之外,其他部分都是一模一样的,那就好办了,给出一个变量page,然后用for循环:

site1 <- "https://www.zhipin.com/c101280600/h_101280600/?query=数据分析&page="
site2 <- "&ka=page-"
page <- 1
for(page in 1:30){
  site <- paste(site1,page,site2,page,sep="")
  webpage <- read_html(site)
  循…
  环…
  内…
  容…
  …

}

site1和site2控制着整个网址的固定部分,page控制网址的变动部分,从1循环到30。

循环中的第一个语句,用paste将site1、site2、page连接成一个完整的网址。

第二句:将网页信息保存到webpage这个变量里,以后的所有抓取动作,都是从这个变量里来的。

</br>

#由于获取网页中商品数据需要对html源码结构进行分析,因此可以直接在浏览器中查看后,再到R中进行编辑

第一页的网址:

然后,确定抓取内容

这一步主要是回到网页中来:

澳门新浦京娱乐场网站 22

截图4

可以发现,在每条招聘信息里,可以爬取这些内容:标题、薪资、公司名、地点、经验要求、学历要求、行业、融资/上市情况、公司规模、关键词、联系人及其岗位。

不同的内容在不同的标签里面,这里仅仅拿部分内容举例说明,其他信息的爬取都是大同小异的,详见附件源码或联系小鑫(E-mail:rockyxin@rockyxin.com)

值得一提的是,不同招聘信息的关键词数量不同,所以,我就单独把关键词作为另一项内容保存了起来,用于后面做词云。

</br>

澳门新浦京娱乐场网站 23

第二页的网址:

OK | 开始爬取

先爬取标题和公司名称,用谷歌浏览器和插件,可得知标题和公司名称所在的标签分别是:.info-primary .name.company-text .name,使用如下语句:

name1 <- html_nodes(webpage,'.info-primary .name')# 抓取标题
name2 <- html_nodes(webpage,'.company-text .name')# 抓取公司名称

查看name1和name2。

澳门新浦京娱乐场网站 24

截图5

可以看出,已经爬取了正确的信息,只是需要删除那些标签和不需要的内容,接下来的思路就很简单了,使用gsub函数,将不必要的内容替换成空。

比如:< h3 class="name">、< span class="red">、< /span>n</h3>这些标签。

name1 <- gsub("<h3 class="name">","",name1)
name1 <- gsub(" .*","",name1)
name1 <- gsub("n</h3>","",name1)
name1 <- gsub("</h3>","",name1)
titlename <- as.data.frame(name1)

name2 <- gsub("<h3 class="name">","",name2)
name2 <- gsub("</h3>","",name2)
companyname <- as.data.frame(name2)

这个时候,再看一下数据内容:

澳门新浦京娱乐场网站 25

截图6

保存数据:

bossdata <- data.frame(companyname,titlename)
bossdata

可以看出,能完成到这一步,基本上算是完成了90%,后面的思路都是大同小异的,注意变换一下形式就OK了,但是还是有一个小问题,就是剩下的10%。

在源码中很容易找到网站导航中子网站的网址

第三页的网址:

继续 | 最后一小步

然后就是抓取薪资,这一步也很简单,直接上代码:

# 抓取薪资
salary <- html_nodes(webpage,'.red')
salary <- gsub("","",salary)
salary <- gsub("","",salary)

bossdata <- cbind(bossdata,salary)
bossdata

问题出在了这一步:

# 抓取要求及公司信息
message <- html_nodes(webpage,'p')
message <- message[-1]
message <- gsub("<p>","",message)
message <- gsub("<em class="vline"></em>",",",message)
message <- gsub("</p>","",message)
message <- gsub("<img",",",message)
message

澳门新浦京娱乐场网站 26

截图7

可以看得出来,问题就在于“地点、工作经验、学历”在同一个位置,“行业、融资/上市情况、公司规模”也在同一个位置,这样的情况下,就不能按照上面的方法来操作了,其实也不难,只要设置一个循环,重点就解决了。

# 先设置三个变量,分别读取message中的不同数据
xx <- c(1:as.numeric(length(message)/3))
yy <- c(1:as.numeric(length(message)/3))
zz <- c(1:as.numeric(length(message)/3))

# xx用来存放message中的地点、经验、学历要求
k1 <- 1
l1 <- 1
for(k1 in seq(1:(length(message)/3))){
  xx[k1] <- message[l1]
  l1 <- k1*3 1
}
xx

# 可以看出xx虽然提取正确了,但是还需要进一步处理
xx <- as.data.frame(xx)
xx <- apply(as.data.frame(xx),1,strsplit,",")
xx <- as.data.frame(xx)
xx[1,]

# 分别提取xx中的地点,经验,学历
place <- t(as.data.frame(xx[1,]))
experience <- t(as.data.frame(xx[2,]))
education <- t(as.data.frame(xx[3,]))

# 合并数据框
bdata <- data.frame(place,experience,education)
names(bdata) = c("place", "experience", "education")
bossdata <- data.frame(bossdata, bdata)
bossdata

后面需要提取行业、融资/上市情况、公司规模等信息,都是采用相同的方法,具体内容,可以查看附件代码。至此,最简单的一个爬虫就写好了。

一般来说,行业、融资/上市情况、公司规模这三个是在一起的,但是有两条信息,只有两个内容,如下图:

澳门新浦京娱乐场网站 27

截图8

澳门新浦京娱乐场网站 28

截图9

我的解决方法是:找到相应的位置,然后在那个地方填补一个缺失值NA,比如,在小鑫运行程序的时候,他们处在第一页的第十一和第十五条数据,因此,小鑫使用如下代码:

if(page == 1){
  financing11 <- financing[11,]
  financing15 <- financing[15,]

  financing[11,] <- NA
  financing[15,] <- NA
  companysize[11,] <- financing11
  companysize[15,] <- financing15
}
else {
  print("Hello World")
}

但是这种方法有很大的弊端,小鑫在写这篇文章的时候,这两条信息又跑到了第二页第五条和第十三条。因此,第一行的代码就变成了page == 2,第二三行分别是:financing5 <- financing[5,]
financing13 <- financing[13,]

小鑫在想是不是可以让R自动识别他们的位置,然后填充NA,甚至于在以后出现第三条、第四条类似信息的时候,也能识别出空缺的位置,然后进行自动填补呢?

应该是可以的,不过小鑫现在才疏学浅,还没那个技术。待小鑫技术学成,再奉上文章。

<div align = "right">——2017年5月19日</div>

【END】


源代码及爬取后数据

链接:http://pan.baidu.com/s/1jI5Lmke

密码:0cjv

澳门新浦京娱乐场网站 29

依次类推

#因此可以通过xmlPath语言找到相应子网站的节点

咱们可以发现第63页的网址是:

a <- getNodeSet(txt, path = "//a[@class = 'parent topnav-logged-in ']")#找到子网页的xml路径​

2、分析每页网页的源代码

澳门新浦京娱乐场网站 30

通过查看第一页的网页的源代码,可以发现,第一页上的每天的产品报价的链接。

如果得到的中文有乱码,则需要对编码进行转换

澳门新浦京娱乐场网站 31

b <- sapply(a,xmlValue)

则,整体思路为

c <- iconv(b,"utf-8","gbk")

(1)拼接所有页的网址(

c

(2)解析出每页中的数据链接(<A href=/chalco/ywycp/cpbj/webinfo/2018/08/1533256568236442.htm澳门新浦京娱乐场网站, target=_blank>中国铝业2018年8月3日产品报价</A>);

否则 可以通过xmlGetAttr函数 得到所需的attributes

澳门新浦京娱乐场网站:记一次Python爬虫分享,电商网站爬虫er。(3)通过链接正则匹配出所需要的数据。

​d <- sapply(a,xmlGetAttr , "href")#获取子网页


澳门新浦京娱乐场网站 32

 二、Python源码

​​由于得到的只是子网页的路径,要获取子网页的数据 需要用paste链接网站根目录地址

 此次爬取,使用的是request和re包!

d1=paste(url,d[1],sep="" )

澳门新浦京娱乐场网站 33澳门新浦京娱乐场网站 34

​#对于批量爬取商品的信息还需要获取商品展示子网页的页数

 1 __Author__ = "MEET Shen"
 2 import requests
 3 import re
 4 import pandas as pd
 5 
 6 def get_allpage_url(n):
 7     '''
 8     得到所有页的连接
 9     '''
10     totalpage_urls=[]
11     for i in range(n):
12         i=i 1
13         url_change_page="http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_{0}.htm".format(str(i))
14         totalpage_urls.append(url_change_page)
15     return totalpage_urls
16 url=get_allpage_url(20)
17 def get_datapage_url(data):
18     '''
19     http://www.chalco.com.cn/chalco/ywycp/cpbj/webinfo/2018/06/1530058323659676.htm
20                             /chalco/ywycp/cpbj/webinfo/2018/06/1530058323659676.htm
21     :return:
22     '''
23     #正则表达式进行解析出所有的数据连接
24     pattern=re.compile('.*?</DIV><DIV class=cpbj-item-xz><A href=(.*?) target=_blank>.*?',re.S)
25     items=re.findall(pattern,data)
26     del items[0]
27     result_url=[]
28     for i in items:
29         joint="http://www.chalco.com.cn{0}".format(i)
30         result_url.append(joint)
31     items_len=len(items)
32     return result_url,items_len
33 
34 
35 headers={"User-Agent":'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
36                       ' (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 '
37                       'Core/1.53.4482.400 QQBrowser/9.7.13001.400'}
38 
39 def get_everypage_data(result_url):
40     response = requests.get(url=result_url, headers=headers)
41     data = response.text
42     pattern=re.compile('.*?<P><STRONG>日历时间:</STRONG>(.*?)</P>.*?'
43                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
44                        '<TD bgColor=#ffffff>(.*?) </TD>.*?'
45                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
46                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
47                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
48                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
49                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
50                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
51                        ,re.S)
52     items=re.findall(pattern,data)
53     items1=list(items[0])
54     items1[7] = items1[7].replace('<p>','')
55     items1[7] = items1[7].replace('</p>','')
56     items1[8] = items1[8].replace('<p>','')
57     items1[8] = items1[8].replace('</p>','')
58     items1[8] = items1[8].replace('&nbsp;</P>', '')
59     items1[5] = items1[5].replace('<FONT size=3 face="Times New Roman">', '')
60     items1[5] = items1[5].replace('</FONT>', '')
61     items1[6] = items1[6].replace('<FONT size=3 face="Times New Roman">', '')
62     items1[6] = items1[6].replace('</FONT>', '')
63     items1[7] = items1[7].replace('<FONT size=3 face="Times New Roman">', '')
64     items1[7] = items1[7].replace('</FONT>', '')
65     items1[8] = items1[8].replace('<FONT size=3 face="Times New Roman">', '')
66     items1[8] = items1[8].replace('</FONT>', '')
67     return items1
68 
69 
70 def get_asignpage_data():
71     items = []
72     for i in range(len(url)):
73         response = requests.get(url=url[i], headers=headers)
74         data = response.text
75         result_url,items_len = get_datapage_url(data)
76         for i in range(items_len):
77             item=get_everypage_data(result_url[i])
78             items.append(item)
79     return items
80 
81 items=get_asignpage_data()
82 
83 #存为CSV格式
84 import pandas as pd
85 data=pd.DataFrame(items,columns={'time','产品名称','规格','合同','中铝企业','华东市场','华南市场','西南市场','中原市场'})
86 print(data)
87 data.to_csv('C:/Users/Administrator/PycharmProjects/untitled/data/lvye1.csv',sep=',')

每页显示40个商品,一共有1200个商品。

View Code

澳门新浦京娱乐场网站 35


澳门新浦京娱乐场网站 36

三、爬取的最终结果

​​​通过网址,我们很容易了解商品展示页的地址规则。

澳门新浦京娱乐场网站:记一次Python爬虫分享,电商网站爬虫er。由于数据不很大,爬取的速度还是能够接受的,最终爬取的数据,且形成的CSV文件如下所示:

澳门新浦京娱乐场网站 37

澳门新浦京娱乐场网站 38

#因此,可以通过一个简单的循环来获取所有网页的地址,从而获取每个网页的所有商品信息。​​​

 

a <- getNodeSet(txt, path = "//span[@class = 'page-number']")#找到子网页的xml路径​(部分代码省略)

 

d <- sapply(a,xmlGetAttr , "data-number-link")#获取子网页中的目录


pagenum=strsplit(d,"=")

笔者还处于学习的状态,如有写得不够专业或有错误的地方,真心希望各位读者前来探讨!!!!!

maxpagenum=0;


for(i in 1:length(pagenum)){

 

maxpagenum[i]= pagenum[[i]][3]

}

maxpagenum=max(as.numeric(maxpagenum))

#[1] 1200

#在获得所有网页后,获取所有商品的信息就变得简单了,只要循环对每个网页的信息进行xml关键字的爬取

#名称信息​

澳门新浦京娱乐场网站 39

图片信息

澳门新浦京娱乐场网站 40

价格信息

澳门新浦京娱乐场网站 41

​通过文本处理和输出,就可以将其进行保存和后续的数据分析。

欢迎交流讨论批评指正(qq 570881451)​

澳门新浦京娱乐场网站 42


【拓端数据tecdat.cn】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。

澳门新浦京娱乐场网站 43

中国专业的统计分析和数据挖掘咨询服务商:拓端数据(商务合作请联系官网客服)

帅的小伙伴都关注了拓端数据团队^..^~

QQ交流群:186388004

微信公众号:拓端数据

微信客服号:lico_9e

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:记一次Python爬虫分享,