精华内容
下载资源
问答
  • 本文需要学习的地方,使用三种不同的方式爬取需要登录才能获取数据的网站数据POST 请求方法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对麻烦;添加 Cookies 方法:先登录将...

    本文转载自以下链接:https://www.makcyun.top/web_scraping_withpython8.html

    目的是万一博主网站无法访问到的话自己需要学习的东西可就不存在了.

    本文需要学习的地方,使用三种不同的方式爬取需要登录才能获取数据的网站数据

    POST 请求方法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对麻烦;

    添加 Cookies 方法:先登录将获取到的 Cookies 加入 Headers 中,最后用 GET 方法请求登录,这种最为方便;

    Selenium 模拟登录:代替手工操作,自动完成账号和密码的输入,简单但速度比较慢。

    对于很多要先登录的网站来说,模拟登录往往是爬虫的第一道坎。本文介绍 POST 请求登录、获取 Cookies 登录、Seleium 模拟登录三种方法。

    摘要: 在进行爬虫时,除了常见的不用登录就能爬取的网站,还有一类需要先登录的网站。比如豆瓣、知乎,以及上一篇文章中的桔子网。这一类网站又可以分为:只需输入帐号密码、除了帐号密码还需输入或点击验证码等类型。本文以只需输入账号密码就能登录的桔子网为例,介绍模拟登录常用的 3 种方法。

    POST 请求方法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对麻烦;

    添加 Cookies 方法:先登录将获取到的 Cookies 加入 Headers 中,最后用 GET 方法请求登录,这种最为方便;

    Selenium 模拟登录:代替手工操作,自动完成账号和密码的输入,简单但速度比较慢。

    下面,我们用代码分别实现上述 3 种方法。

    1. 目标网页

    这是我们要获取内容的网页:

    这个网页需要先登录才能看到数据信息,登录界面如下:

    可以看到,只需要输入账号和密码就可以登录,不用输验证码,比较简单。下面我们利用一个测试账号和密码,来实现模拟登录。

    2. POST 提交请求登录

    首先,我们要找到 POST 请求的 URL。

    有两种方法,第一种是在网页 devtools 查看请求,第二种是在 Fiddler 软件中查看。

    先说第一种方法。

    在登录界面输入账号密码,并打开开发者工具,清空所有请求,接着点击登录按钮,这时便会看到有大量请求产生。哪一个才是 POST 请求的 URL呢?这个需要一点经验,因为是登录,所以可以尝试点击带有 「login」字眼的请求。这里我们点击第四个请求,在右侧 Headers 中可以看到请求的 URL,请求方式是 POST类型,说明 URL 找对了。

    接着,我们下拉到 Form Data,这里有几个参数,包括 identify 和 password,这两个参数正是我们登录时需要输入的账号和密码,也就是 POST 请求需要携带的参数。

    参数构造非常简单,接下来只需要利用 Requests.post 方法请求登录网站,然后就可以爬取内容了。

    下面,我们尝试用 Fiddler 获取 POST 请求。

    如果你对 Fiddler 还不太熟悉或者没有电脑上没有安装,可以先了解和安装一下。

    Fiddler 是位于客户端和服务器端的 HTTP 代理,也是目前最常用的 HTTP 抓包工具之一 。 它能够记录客户端和服务器之间的所有 HTTP 请求,可以针对特定的 HTTP 请求,分析请求数据、设置断点、调试 web 应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是 web 调试的利器。

    Fiddler 下载地址:

    使用教程:

    下面,我们就通过 Fiddler 截取登录请求。

    当点击登录时,官场 Fiddler 页面,左侧可以看到抓取了大量请求。通过观察,第15个请求的 URL中含有「login」字段,很有可能是登录的 POST 请求。我们点击该请求,回到右侧,分别点击「inspectors」、「Headers」,可以看到就是 POST 请求,该 URL 和上面的方法获取的 URL 是一致的。

    接着,切换到右侧的 Webforms 选项,可以看到 Body 请求体。也和上面方法中得到的一致。

    获取到 URL 和请求体参数之后,下面就可以开始用 Requests.post 方法模拟登录了。

    代码如下:

    import requests

    headers = {

    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',

    }

    data = {

    'identity':'irw27812@awsoo.com',

    'password':'test2018',

    }

    url ='https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='

    session = requests.Session()

    session.post(url,headers = headers,data = data)

    # 登录后,我们需要获取另一个网页中的内容

    response = session.get('http://radar.itjuzi.com/investevent',headers = headers)

    print(response.status_code)

    print(response.text)

    使用 session.post 方法提交登录请求,然后用 session.get 方法请求目标网页,并输出 HTML代码。可以看到,成功获取到了网页内容。

    下面,介绍第 2 种方法。

    3. 获取 Cookies,直接请求登录

    上面一种方法,我们需要去后台获取 POST 请求链接和参数,比较麻烦。下面,我们可以尝试先登录,获取 Cookie,然后将该 Cookie 添加到 Headers 中去,然后用 GET 方法请求即可,过程简单很多。

    代码如下:

    import requests

    headers = {

    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',

    'Cookie': '你的cookie',

    }

    url = 'https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='

    session = requests.Session()

    response = session.get('http://radar.itjuzi.com/investevent', headers=headers)

    print(response.status_code)

    print(response.text)

    可以看到,添加了 Cookie 后就不用再 POST 请求了,直接 GET 请求目标网页即可。可以看到,也能成功获取到网页内容。

    下面介绍第 3 种方法。

    4. Selenium 模拟登录

    这个方法很直接,利用 Selenium 代替手动方法去自动输入账号密码然后登录就行了。

    关于 Selenium 的使用,在之前的一篇文章中有详细介绍,如果你不熟悉可以回顾一下:

    代码如下:

    from selenium import webdriver

    from selenium.webdriver.common.by import By

    from selenium.webdriver.support import expected_conditions as EC

    from selenium.webdriver.support.wait import WebDriverWait

    browser = webdriver.Chrome()

    browser.maximize_window() # 最大化窗口

    wait = WebDriverWait(browser, 10) # 等待加载10s

    def login():

    browser.get('https://www.itjuzi.com/user/login')

    input = wait.until(EC.presence_of_element_located(

    (By.XPATH, '//*[@id="create_account_email"]')))

    input.send_keys('irw27812@awsoo.com')

    input = wait.until(EC.presence_of_element_located(

    (By.XPATH, '//*[@id="create_account_password"]')))

    input.send_keys('test2018')

    submit = wait.until(EC.element_to_be_clickable(

    (By.XPATH, '//*[@id="login_btn"]')))

    submit.click() # 点击登录按钮

    get_page_index()

    def get_page_index():

    browser.get('http://radar.itjuzi.com/investevent')

    try:

    print(browser.page_source) # 输出网页源码

    except Exception as e:

    print(str(e))

    login()

    这里,我们在网页中首先定位了账号节点位置:'//*[@id="create_account_email"]',然后用 input.send_keys 方法输入账号,同理,定位了密码框位置并输入了密码。接着定位 登录 按钮的位置://*[@id="login_btn"],然后用 submit.click() 方法实现点击登录按钮操作,从而完成登录。可以看到,也能成功获取到网页内容。

    以上就是模拟需登录网站的几种方法。当登录进去后,就可以开始爬取所需内容了。

    5. 总结:

    本文分别实现了模拟登录的 3 种操作方法,建议优先选择第 2 种,即先获取 Cookies 再 Get 请求直接登录的方法。

    本文模拟登录的网站,仅需输入账号密码,不需要获取相关加密参数,比如 Authenticity_token ,同时也无需输入验证码,所以方法比较简单。但是还有很多网站模拟登录时,需要处理加密参数、验证码输入等问题。后续将会介绍。

    展开全文
  • 但是,如果使用Python或是其他脚本语言来爬取数据需要使用很专业的编程知识,学习HTML、BeautifulSoup、request等等又苦又累,一不小心还会秃头!有没有办法可以让我们简单地爬取数据而不用去这些复杂的编程语言呢...
    7f2ed854a09b413c8ee6c36e7689f706.png在工作和生活中,我们收到从网页上摘取数据的需求,比如需要统计电商网站上不同产品的价格、销量等等。如果是手工复制粘贴就比较麻烦。但是,如果使用Python或是其他脚本语言来爬取数据需要使用很专业的编程知识,学习HTML、BeautifulSoup、request等等又苦又累,一不小心还会秃头!有没有办法可以让我们简单地爬取数据而不用去学这些复杂的编程语言呢?今天小趣就给大家带来一种方法,通过一个叫做Web scraper的Chrome扩展器,三分钟不到就能学会爬取数据!e54b0e09b2ff1bcb7b16f7237f66586e.png

    以爬取网站小说列表为例

    我们首先在Chrome浏览器安装一个Web scraper插件,安装后按下f12或如图所示,打开开发者工具,并开发者工具调整到页面的下方,就可以开始爬取了。87b87a8e6cb47dcec28c463bc0b59fcf.png

    什么是elements?

    开始爬取之前,先跟大家讲讲什么是elements!一般来说,网站上的数据会分装在不同的项目中,我们称之为elements。相同的element里面包含的数据类型也是相同的。我们给网站爬虫指定好需要爬取的elements以及定位出每个元素内部需要爬取的数据标签,爬虫就会自动爬取这个页面上所有的elements,将带有相同数据标签的文本、图片、链接等等存在文件中。

    三步配置爬虫

    1)新建SiteMap

    了解了elements,现在开始配置爬虫。如图所示,打开网页后,选中最后一个选项卡,选择创建一个网站地图(SiteMap)。给这个地图起一个名字,把需要爬取数据的链接复制进地址栏,然后点击创建地图。5683058c13432a5a2e2ec7f415677d69.png

    2)定义elements爬取范围

    之后我们要定义element主要是有哪些范围,我们给他起个名字,叫做box,然后类型选择elements。把mulitiple多选框打开,点击select,然后选中页面上的两个相邻的elements,让插件知道我们要爬取的容器的类型,以及elements是从哪里开始。之后,点击页面上的Done Slecting按钮,结束选择并保存这个筛选器。d5f0741ed0d7356e946e3b12a2bdc527.png

    3)相同elements里面定义不同的id

    我们进入root界面,看到我们刚才已经写好的box筛选器,点击进入二级菜单。然后在筛选器内新建一个新的二级筛选器。这里可以看到我们的elements已经被框成一个黄颜色的窗格,说明我们是在box里面进行筛选。5de0eed8983936a35d936ea9aec15737.png然后我们就像之前建立box筛选器一样,分别建立书名、作者、价格和评论数的筛选器。注意Type这里我们需要选择text,而不是elements类型了。这样的话我们的这个文字才会被输出到文件中,然后同样的点击Done select,把这个筛选器保存好。

    开始爬取数据

    如图,我们已经建立了标题、作者、价格、和评论数4个筛选器,然后回到Box层级下,点击第2个SiteMap amazon-book选项卡,选择Scrape按钮进行爬取操作。然后这个时候,插件就会自动打开一个小窗口开始爬取。接下来我们就可以看见我们的数据,已经被保存到文件中。c5d6dcf3a053ab511b55b386ddda3f65.png打开文件就可以看到数据已经完完全全被抓下来了。怎么样,三分钟不到就学会爬取数据是不是成就感爆棚呢?!ca562baa8a778f883050d4281f067d16.png除了爬取单页的内容,如果进行相应的设置还可以对多个页面或者是二级菜单进行爬取,具体详情可以点击插件上的视频教程按钮来跟着视频教程一起学习。或私信@趣玩好工具【爬虫】获取Web Scraper视频教程,因为篇幅的原因就不在这里赘述了。以上就是小趣本次的教程了,希望你能喜欢!f6d7385d53c676875f26b1a1406b5de7.png其他值得推荐的Appdce9f63be41f4e5c1bdad58044af69fa.png5b3043b34b728bc0f2ee901a2aaece29.png4adb55b35e7f56ca0ad769f765a7ace9.png
    展开全文
  • 本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页 https://www.makcyun.top/web_scraping_withpython16.html需要学习的地方有两种方法。第一种方式 使用 For 循环配合 break 语句,尾页的页数设置...

    本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页  https://www.makcyun.top/web_scraping_withpython16.html

    需要学习的地方

    有两种方法。

    第一种方式 使用 For 循环配合 break 语句,尾页的页数设置一个较大的参数,足够循环爬完所有页面,爬取完成时,break 跳出循环,结束爬取。

    第二种方法 使用 While 循环,可以结合 break 语句,也可以设起始循环判断条件为 True,从头开始循环爬取直到爬完最后一页,然后更改判断条件为 False 跳出循环,结束爬取。

    Requests 和 Scrapy 中分别用 For 循环和 While 循环爬取不确定页数的网页。

    摘要:Requests 和 Scrapy 中分别用 For 循环和 While 循环爬取不确定页数的网页。

    我们通常遇到的网站页数展现形式有这么几种:

    第一种是直观地显示所有页数,比如此前爬过的酷安、东方财富网,

    文章见:

    第二种是不直观显示网页总页数,需要在后台才可以查看到,比如之前爬过的虎嗅网,文章见:

    第三种是今天要说的,不知道具体有多少页的网页,比如豌豆荚:

    对于,前两种形式的网页,爬取方法非常简单,使用 For 循环从首页爬到尾页就行了,第三种形式则不适用,因为不知道尾页的页数,所以循环到哪一页结束无法判断。

    那如何解决呢?有两种方法。

    第一种方式 使用 For 循环配合 break 语句,尾页的页数设置一个较大的参数,足够循环爬完所有页面,爬取完成时,break 跳出循环,结束爬取。

    第二种方法 使用 While 循环,可以结合 break 语句,也可以设起始循环判断条件为 True,从头开始循环爬取直到爬完最后一页,然后更改判断条件为 False 跳出循环,结束爬取。

    实际案例

    下面,我们以 豌豆荚 网站中「视频」类别下的 App 信息为例,使用上面两种方法抓取该分类下的所有 App 信息,包括 App 名称、评论、安装数量和体积。

    首先,简要分析下网站,可以看到页面是通过 Ajax 加载的,GET 请求附带一些参数,可以使用 params 参数构造 URL 请求,但不知道一共有多少页,为了确保下载完所有页,设置较大的页数,比如 100页 甚至 1000 页都行。

    下面我们尝试使用 For 和 While 循环爬取 。

    Requests

    ▌For 循环

    主要代码如下:

    class Get_page():

    def __init__(self):

    # ajax 请求url

    self.ajax_url = 'https://www.wandoujia.com/wdjweb/api/category/more'

    def get_page(self,page,cate_code,child_cate_code):

    params = {

    'catId': cate_code,

    'subCatId': child_cate_code,

    'page': page,

    }

    response = requests.get(self.ajax_url, headers=headers, params=params)

    content = response.json()['data']['content'] #提取json中的html页面数据

    return content

    def parse_page(self, content):

    # 解析网页内容

    contents = pq(content)('.card').items()

    data = []

    for content in contents:

    data1 = {

    'app_name': content('.name').text(),

    'install': content('.install-count').text(),

    'volume': content('.meta span:last-child').text(),

    'comment': content('.comment').text(),

    }

    data.append(data1)

    if data:

    # 写入MongoDB

    self.write_to_mongodb(data)

    if __name__ == '__main__':

    # 实例化数据提取类

    wandou_page = Get_page()

    cate_code = 5029 # 影音播放大类别编号

    child_cate_code = 716 # 视频小类别编号

    for page in range(2, 100):

    print('*' * 50)

    print('正在爬取:第 %s 页' % page)

    content = wandou_page.get_page(page,cate_code,child_cate_code)

    # 添加循环判断,如果content 为空表示此页已经下载完成了,break 跳出循环

    if not content == '':

    wandou_page.parse_page(content)

    sleep = np.random.randint(3,6)

    time.sleep(sleep)

    else:

    print('该类别已下载完最后一页')

    break

    这里,首先创建了一个 Get_page 类,get_page 方法用于获取 Response 返回的 json 数据,通过 json.cn 网站解析 json 解析后发现需要提取的内容是一段包裹在 data 字段下 content 键中的 html 文本,可以使用 parse_page 方法中的 pyquery 函数进行解析,最后提取出 App 名称、评论、安装数量和体积四项信息,完成抓取。

    在主函数中,使用了 if 函数进行条件判断,若 content 不为空,表示该页有内容,则循环爬下去,若为空则表示此页面已完成了爬取,执行 else 分支下的 break 语句结束循环,完成爬取。

    爬取结果如下,可以看到该分类下一共完成了全部 41 页的信息抓取。

    ▌While 循环

    While 循环和 For 循环思路大致相同,不过有两种写法,一种仍然是结合 break 语句,一种则是更改判断条件。

    总体代码不变,只需修改 For 循环部分:

    page = 2 # 设置爬取起始页数

    while True:

    print('*' * 50)

    print('正在爬取:第 %s 页' %page)

    content = wandou_page.get_page(page,cate_code,child_cate_code)

    if not content == '':

    wandou_page.parse_page(content)

    page += 1

    sleep = np.random.randint(3,6)

    time.sleep(sleep)

    else:

    print('该类别已下载完最后一页')

    break

    或者:

    page = 2 # 设置爬取起始页数

    page_last = False # while 循环初始条件

    while not page_last:

    #...

    else:

    # break

    page_last = True # 更改page_last 为 True 跳出循环

    结果如下,可以看到和 For 循环的结果是一样的。

    我们可以再测试一下其他类别下的网页,比如选择「K歌」类别,编码为:718,然后只需要对应修改主函数中的child_cate_code 即可,再次运行程序,可以看到该类别下一共爬取了 32 页。

    由于 Scrapy 中的写法和 Requests 稍有不同,所以接下来,我们在 Scrapy 中再次实现两种循环的爬取方式 。

    Scrapy

    ▌For 循环

    Scrapy 中使用 For 循环递归爬取的思路非常简单,即先批量生成所有请求的 URL,包括最后无效的 URL,后续在 parse 方法中添加 if 判断过滤无效请求,然后爬取所有页面。由于 Scrapy 依赖于Twisted框架,采用的是异步请求处理方式,也就是说 Scrapy 边发送请求边解析内容,所以这会发送很多无用请求。

    def start_requests(self):

    pages=[]

    for i in range(1,10):

    url='http://www.example.com/?page=%s'%i

    page = scrapy.Request(url,callback==self.pare)

    pages.append(page)

    return pages

    下面,我们选取豌豆荚「新闻阅读」分类下的「电子书」类 App 页面信息,使用 For 循环尝试爬取,主要代码如下:

    def start_requests(self):

    cate_code = 5019 # 新闻阅读

    child_cate_code = 940 # 电子书

    print('*' * 50)

    pages = []

    for page in range(2,50):

    print('正在爬取:第 %s 页 ' %page)

    params = {

    'catId': cate_code,

    'subCatId': child_cate_code,

    'page': page,

    }

    category_url = self.ajax_url + urlencode(params)

    pa = yield scrapy.Request(category_url,callback=self.parse)

    pages.append(pa)

    return pages

    def parse(self, response):

    if len(response.body) >= 100: # 判断该页是否爬完,数值定为100是因为response无内容时的长度是87

    jsonresponse = json.loads(response.body_as_unicode())

    contents = jsonresponse['data']['content']

    # response 是json,json内容是html,html 为文本不能直接使用.css 提取,要先转换

    contents = scrapy.Selector(text=contents, type="html")

    contents = contents.css('.card')

    for content in contents:

    item = WandoujiaItem()

    item['app_name'] = content.css('.name::text').extract_first()

    item['install'] = content.css('.install-count::text').extract_first()

    item['volume'] = content.css('.meta span:last-child::text').extract_first()

    item['comment'] = content.css('.comment::text').extract_first().strip()

    yield item

    上面代码很好理解,简要说明几点:

    第一、判断当前页是否爬取完成的判断条件改为了 response.body 的长度大于 100。

    因为请求已爬取完成的页面,返回的 Response 结果是不为空的,而是有长度的 json 内容(长度为 87),其中 content 键值内容才为空,所以这里判断条件选择比 87 大的数值即可,比如 100,即大于 100 的表示此页有内容,小于 100 表示此页已爬取完成。

    {"state":{"code":2000000,"msg":"Ok","tips":""},"data":{"currPage":-1,"content":""}}

    第二、当需要从文本中解析内容时,不能直接解析,需要先转换。

    通常情况下,我们在解析内容时是直接对返回的 response 进行解析,比如使用 response.css() 方法,但此处,我们的解析对象不是 response,而是 response 返回的 json 内容中的 html 文本,文本是不能直接使用 .css() 方法解析的,所以在对 html 进行解析之前,需要添加下面一行代码转换后才能解析。

    contents = scrapy.Selector(text=contents, type="html")

    结果如下,可以看到发送了全部 48 个请求,实际上该分类只有 22 页内容,即多发送了无用的 26 个请求。

    ▌While 循环

    接下来,我们使用 While 循环再次尝试抓取,代码省略了和 For 循环中相同的部分:

    def start_requests(self):

    page = 2 # 设置爬取起始页数

    dict = {'page':page,'cate_code':cate_code,'child_cate_code':child_cate_code} # meta传递参数

    yield scrapy.Request(category_url,callback=self.parse,meta=dict)

    def parse(self, response):

    if len(response.body) >= 100: # 判断该页是否爬完,数值定为100是因为无内容时长度是87

    page = response.meta['page']

    cate_code = response.meta['cate_code']

    child_cate_code = response.meta['child_cate_code']

    #...

    for content in contents:

    yield item

    # while循环构造url递归爬下一页

    page += 1

    params = {

    'catId': cate_code,

    'subCatId': child_cate_code,

    'page': page,

    }

    ajax_url = self.ajax_url + urlencode(params)

    dict = {'page':page,'cate_code':cate_code,'child_cate_code':child_cate_code}

    yield scrapy.Request(ajax_url,callback=self.parse,meta=dict)

    这里,简要说明几点:

    第一、While 循环的思路是先从头开始爬取,使用 parse() 方法进行解析,然后递增页数构造下一页的 URL 请求,再循环解析,直到爬取完最后一页即可,这样 不会像 For 循环那样发送无用的请求。

    第二、parse() 方法构造下一页请求时需要利用 start_requests() 方法中的参数,可以 使用 meta 方法来传递参数。

    运行结果如下,可以看到请求数量刚好是 22 个,也就完成了所有页面的 App 信息爬取。

    以上,就是本文的所有内容,小结一下:

    在爬取不确定页数的网页时,可以采取 For 循环和 While 循环两种思路,方法大致相同。

    在 Requests 和 Scrapy 中使用 For 循环和 While 循环的方法稍有不同,因此本文以豌豆荚网站为例,详细介绍了循环构造方法。

    展开全文
  • 本文转载自以下链接:...本文需要学习的地方,使用三种不同的方式爬取需要登录才能获取数据的网站数据 POST 请求方法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对麻烦; 添加 Co...

    本文转载自以下链接:https://www.makcyun.top/web_scraping_withpython8.html

    目的是万一博主网站无法访问到的话自己需要学习的东西可就不存在了.

     

    本文需要学习的地方,使用三种不同的方式爬取需要登录才能获取数据的网站数据

    • POST 请求方法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对麻烦;
    • 添加 Cookies 方法:先登录将获取到的 Cookies 加入 Headers 中,最后用 GET 方法请求登录,这种最为方便;
    • Selenium 模拟登录:代替手工操作,自动完成账号和密码的输入,简单但速度比较慢。

     

     

    对于很多要先登录的网站来说,模拟登录往往是爬虫的第一道坎。本文介绍 POST 请求登录、获取 Cookies 登录、Seleium 模拟登录三种方法。

    摘要: 在进行爬虫时,除了常见的不用登录就能爬取的网站,还有一类需要先登录的网站。比如豆瓣、知乎,以及上一篇文章中的桔子网。这一类网站又可以分为:只需输入帐号密码、除了帐号密码还需输入或点击验证码等类型。本文以只需输入账号密码就能登录的桔子网为例,介绍模拟登录常用的 3 种方法。

    • POST 请求方法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对麻烦;
    • 添加 Cookies 方法:先登录将获取到的 Cookies 加入 Headers 中,最后用 GET 方法请求登录,这种最为方便;
    • Selenium 模拟登录:代替手工操作,自动完成账号和密码的输入,简单但速度比较慢。

    下面,我们用代码分别实现上述 3 种方法。

    1. 目标网页

    这是我们要获取内容的网页:

    http://radar.itjuzi.com/investevent

    这个网页需要先登录才能看到数据信息,登录界面如下:

    可以看到,只需要输入账号和密码就可以登录,不用输验证码,比较简单。下面我们利用一个测试账号和密码,来实现模拟登录。

    2. POST 提交请求登录

    首先,我们要找到 POST 请求的 URL。

    有两种方法,第一种是在网页 devtools 查看请求,第二种是在 Fiddler 软件中查看。

    先说第一种方法。

    在登录界面输入账号密码,并打开开发者工具,清空所有请求,接着点击登录按钮,这时便会看到有大量请求产生。哪一个才是 POST 请求的 URL呢?这个需要一点经验,因为是登录,所以可以尝试点击带有 「login」字眼的请求。这里我们点击第四个请求,在右侧 Headers 中可以看到请求的 URL,请求方式是 POST类型,说明 URL 找对了。

    接着,我们下拉到 Form Data,这里有几个参数,包括 identify 和 password,这两个参数正是我们登录时需要输入的账号和密码,也就是 POST 请求需要携带的参数。

    参数构造非常简单,接下来只需要利用 Requests.post 方法请求登录网站,然后就可以爬取内容了。

    下面,我们尝试用 Fiddler 获取 POST 请求。

    如果你对 Fiddler 还不太熟悉或者没有电脑上没有安装,可以先了解和安装一下。

    Fiddler 是位于客户端和服务器端的 HTTP 代理,也是目前最常用的 HTTP 抓包工具之一 。 它能够记录客户端和服务器之间的所有 HTTP 请求,可以针对特定的 HTTP 请求,分析请求数据、设置断点、调试 web 应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是 web 调试的利器。

    Fiddler 下载地址:

    https://www.telerik.com/download/fiddler

    使用教程:

    https://zhuanlan.zhihu.com/p/37374178

    http://www.hangge.com/blog/cache/detail_1697.html

    下面,我们就通过 Fiddler 截取登录请求。

    当点击登录时,官场 Fiddler 页面,左侧可以看到抓取了大量请求。通过观察,第15个请求的 URL中含有「login」字段,很有可能是登录的 POST 请求。我们点击该请求,回到右侧,分别点击「inspectors」、「Headers」,可以看到就是 POST 请求,该 URL 和上面的方法获取的 URL 是一致的。

    接着,切换到右侧的 Webforms 选项,可以看到 Body 请求体。也和上面方法中得到的一致。

    获取到 URL 和请求体参数之后,下面就可以开始用 Requests.post 方法模拟登录了。

    代码如下:

    import requests
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    }
    data = {
    'identity':'irw27812@awsoo.com',
    'password':'test2018',
    }
    url ='https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
    session = requests.Session()
    session.post(url,headers = headers,data = data)
    # 登录后,我们需要获取另一个网页中的内容
    response = session.get('http://radar.itjuzi.com/investevent',headers = headers)
    print(response.status_code)
    print(response.text)

    使用 session.post 方法提交登录请求,然后用 session.get 方法请求目标网页,并输出 HTML代码。可以看到,成功获取到了网页内容。

    下面,介绍第 2 种方法。

    3. 获取 Cookies,直接请求登录

    上面一种方法,我们需要去后台获取 POST 请求链接和参数,比较麻烦。下面,我们可以尝试先登录,获取 Cookie,然后将该 Cookie 添加到 Headers 中去,然后用 GET 方法请求即可,过程简单很多。

    代码如下:

    import requests
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    'Cookie': '你的cookie',
    }
    url = 'https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='
    session = requests.Session()
    response = session.get('http://radar.itjuzi.com/investevent', headers=headers)

    print(response.status_code)
    print(response.text)

    可以看到,添加了 Cookie 后就不用再 POST 请求了,直接 GET 请求目标网页即可。可以看到,也能成功获取到网页内容。

    下面介绍第 3 种方法。

    4. Selenium 模拟登录

    这个方法很直接,利用 Selenium 代替手动方法去自动输入账号密码然后登录就行了。

    关于 Selenium 的使用,在之前的一篇文章中有详细介绍,如果你不熟悉可以回顾一下:

    https://www.makcyun.top/web_scraping_withpython5.html

    代码如下:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    browser = webdriver.Chrome()
    browser.maximize_window() # 最大化窗口
    wait = WebDriverWait(browser, 10) # 等待加载10s

    def login():
    browser.get('https://www.itjuzi.com/user/login')
    input = wait.until(EC.presence_of_element_located(
    (By.XPATH, '//*[@id="create_account_email"]')))
    input.send_keys('irw27812@awsoo.com')
    input = wait.until(EC.presence_of_element_located(
    (By.XPATH, '//*[@id="create_account_password"]')))
    input.send_keys('test2018')
    submit = wait.until(EC.element_to_be_clickable(
    (By.XPATH, '//*[@id="login_btn"]')))
    submit.click() # 点击登录按钮
    get_page_index()

    def get_page_index():
    browser.get('http://radar.itjuzi.com/investevent')
    try:
    print(browser.page_source) # 输出网页源码
    except Exception as e:
    print(str(e))
    login()

    这里,我们在网页中首先定位了账号节点位置:'//*[@id="create_account_email"]',然后用 input.send_keys 方法输入账号,同理,定位了密码框位置并输入了密码。接着定位 登录 按钮的位置://*[@id="login_btn"],然后用 submit.click() 方法实现点击登录按钮操作,从而完成登录。可以看到,也能成功获取到网页内容。

    以上就是模拟需登录网站的几种方法。当登录进去后,就可以开始爬取所需内容了。

    5. 总结:

    • 本文分别实现了模拟登录的 3 种操作方法,建议优先选择第 2 种,即先获取 Cookies 再 Get 请求直接登录的方法。
    • 本文模拟登录的网站,仅需输入账号密码,不需要获取相关加密参数,比如 Authenticity_token ,同时也无需输入验证码,所以方法比较简单。但是还有很多网站模拟登录时,需要处理加密参数、验证码输入等问题。后续将会介绍。

    转载于:https://www.cnblogs.com/sanduzxcvbnm/p/10276583.html

    展开全文
  • 序出于了解HTTP和爬虫的目的,于是就有了一个自己动手实现一个爬虫,并在此之上做一些简单的数据分析的想法。...综合考虑之下,我决定选择后者,因为自己造的轮子肯定没有别人造的好,以后真的需要用上爬虫,使用sc...
  • 本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页 https://www.makcyun.top/web_scraping_withpython16.html 需要学习的地方 有两种方法。 第一种方式 使用 For 循环配合 break 语句,尾页的...
  • 现在大家都是用python来实现网页数据爬取,但对于广大不会代码的小伙伴来说,要学Python代码,还要学html那些,起码需要一两个月学习才能摸透。今天给大家分享一个简单不用写代码20分钟就可以学会的网页数据获取的...
  • python爬取ajax数据

    2020-11-05 08:34:21
    为什么单独学习爬取ajax数据: 问题:requests抓取的页面信息和浏览器中看到的不一样。 原因:requests获取的都是原始的HTML文档,浏览器中的页面很多都是经过javascript数据处理后的结果,这些数据可能通过AJax加载...
  • 格式化,具有标签的数据信息是具有非常大的分析意义的,然而,靠人工是完成对的海量数据的采集代价太大,所以对于结构化的数据采集,使用爬虫是一个非常高效的选择 技术储备: 可以使用爬虫的语言有很多种,但在学习爬虫...
  • 1.爬取网站 https://www.x23us.com 2.转出处 https://cuiqingcai.com/3472.html 3.遇到的问题 3.1 mysql的模块导入问题 修改为pymysql 3.2 scrapy默认安装的python版本问题 最开始默认是安装到python2.7版本...
  • 1.Selenium简介Selenium是一个用于测试网站的自动化测试工具,支持各种...且查看数据接口,爬取到的数据不是最新的数据,故而使用该框架进行爬取学习。PS:如有需要Python学习资料的小伙伴可以加点击下方链接自...
  • 现在大家都是用python来实现网页数据爬取,但对于广大不会代码的小伙伴来说,要学Python代码,还要学html那些,起码需要一两个月学习才能摸透。今天给大家分享一个简单不用写代码20分钟就可以学会的网页数据获取的...
  • python 爬取万方数据

    千次阅读 2018-06-19 15:43:56
    万方数据是最早的数据平台,针对非计算机专业的用户群体来说,需要经常下载数据。因此今天你用scrapy框架实现一个万方数据下载的爬虫。只需要简单部署即可使用,下载的数据采用万方统一的规定格式存储。下面展示爬虫...
  • 1 网络爬虫引用百度百科的定义:网络爬虫是一种按照一定的规则,...另外,一般情况下还需要保存数据。学习爬虫需要了解的知识:HTML语言:HyperText Markup Language,超文本标记语言,规定了网页应该具有什么样的...
  • 从美国NBA技术统计网站可获取NBA比赛和球队的信息数据,可对其进行数据爬取,便于统计分析。 需要爬取的网址为:http://www.stat-nba.com/team/CHI.html <本文是学习《R语言统计分析与机器学习》后的学习笔记>...
  • jsoup 爬取数据(一)

    千次阅读 2018-03-19 20:05:57
    本人因需要大量数据,今天第一天接触爬虫,使用江湖传说java下的jquery之称的jsoup,确实很方便易上手,也是目前比较流行的技术,对初学者来说非常easy,下面我也会继续写n篇记录自己的学习成长曲线,后续会出分页爬取与...
  • 根据[实战]爬取酷狗TOP500数据[^src]文档信息整理 目标 需要到http://www.kugou.com/yy/rank/home/1-8888.html?from=rank链接获取酷狗TOP500数据 保存排名,歌手名字,歌曲名,时常到Mongo数据库 页面分析 打开url...
  • 1. 简单说明爬虫原理爬虫简单来说就是通过程序模拟浏览器放松请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,通过一些算法进而提取自己需要数据,存放起来使用。2. 理解爬虫...
  • 本菜鸡是python和html初学者,此文记录一下学习历程,并希望可以给有需要的同好提供一点思路。这个程序只是简单的使用了requests_html库,所以效率可能不是很高。 requests_html库介绍 库安装指令: pip install ...
  • 本文转载自一下网站:Python爬虫(5):Selenium 爬取东方财富网股票财务报表 ...利用Selenium爬取东方财富网各上市公司历年的财务报表数据。 摘要: 现在很多网...
  • 最近自学了一下python爬虫,用来简单爬取论坛的数据,只到了一些皮毛,毕竟还是要以实用为主嘛…学会了下面的代码,就可以爬取一些网站的数据了,这里我使用xpath库进行爬取,问我为什么不用正则?因为我还不是很...
  • 且查看数据接口,爬取到的数据不是最新的数据,故而使用该框架进行爬取学习。 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 2.安装Selenium&...
  • 最近大数据预处理学习,老师谈到了网络的爬取方面的知识和技能,现在使用GooSeeker现有的爬取网站的工具,进行爬取相应的网站,该网站为公开网站,不存在数据窃取等问题:天气html 那么我们就开始吧: 首先把...
  • 1.首先我们来分析需要爬取网站的情况 在51job中输入:数据分析师 具体过程详解,请移步:https://blog.csdn.net/qq_31848185/article/details/88967352 贴上我的过程,两种方式两种思路,没有好坏之分,共同学习,...
  • 微信有小程序可以搜索查找“全国新型冠状肺炎小区”,如果你需要数据做进一步的研究和分析,可以试下自己爬取。在此分享一下方法,互相学习和指导。我爬取的是以下链接的数据:新型肺炎小区速查​ncov.html5.qq.com...
  • 确定自己需要数据,并找到最适合爬取的页面 最近学习了一大堆和大数据相关的东西,Hadoop、 二.分析数据所在的标签 三.模拟http获取服务器返回的html 四.用正则表达式提取我们需要的信息 五.存储和展示数据 ...
  • 前两天我爬取了猪八戒上的一些数据网址::http://task.zbj.com/t-ppsj/p1s5.html,可能是由于爬取数据量有点多吧,结果我的IP被封了,需要自己手动来验证解封ip,但这显然阻止了我爬取更多的数据了。 下面是我写...
  • 了一段时间的Python、SQL语句,主要想通过这个爬虫熟悉静态网页站点的爬取,以及将爬取数据在数据库中进行操作的过程。 二、目标网站分析: 人民日报网站是静态网站,其页面跳转是通过 URL 的改变完成的,即所有...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 149
精华内容 59
关键字:

数据爬取需要学html