【问题标题】:How to crawl pagination pages? There is no url change when I Click next page如何爬取分页页面?单击下一页时,网址没有更改
【发布时间】:2016-02-25 06:55:33
【问题描述】:

我用的是python3.5和window10。

当我抓取一些页面时,我通常使用 urlopen 和 'for' 迭代来更改 url。像下面的代码。

from bs4 import BeautifulSoup

import urllib
f = open('Slave.txt','w')

for i in range(1,42):
 html = urllib.urlopen('http://xroads.virginia.edu/~hyper/JACOBS/hjch'+str(i)+'.htm')
 soup = BeautifulSoup(html,"lxml")
 text = soup.getText()
 f.write(text.encode("utf-8"))

f.close()

但是,我遇到了麻烦,因为 url 没有变化,虽然我点击了下一页并且网页内容发生了变化,就像图片一样。 url 没有变化,也没有模式。 enter image description here

网址中没有信号表明我可以捕捉到网站的变化。

http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp

网站在这里 我发现的线索是在分页课上。 我找到了一些指向下一页的链接,但我不知道如何使用此链接 在美丽汤。我认为 commonPagingPost 是开发者定义的函数。

<span class="number"><a href="javascript:;" 
class="on">1</a>&nbsp;&nbsp;
<a href="javascript:commonPagingPost('2','10','Shr01_lis.jsp');">2</a>&nbsp;&nbsp;
<a href="javascript:commonPagingPost('3','10','Shr01_lis.jsp');">3</a>&nbsp;&nbsp;
<a href="javascript:commonPagingPost('4','10','Shr01_lis.jsp');">4</a>&nbsp;&nbsp;
<a href="javascript:commonPagingPost('5','10','Shr01_lis.jsp');">5</a></span>

如何使用 beutifulSoup4 打开或抓取所有这些网站? 当我使用 urlopen 时,我只是得到第一个页面。

【问题讨论】:

  • 在您的网络浏览器中使用检查元素工具,然后在您手动单击页码时进行一些网络捕获。分页很可能是由 HTTP POST 请求处理的。如果您可以收集 POST 请求的有效负载是什么,那么您很可能能够制作您的请求标头,以便您可以在编号页面中移动。

标签: python-3.x beautifulsoup web-crawler urlopen


【解决方案1】:

你不能单独使用 beautifulsoup 来做到这一点,因为它不支持 ajax。您需要使用 seleniumghost.py 或其他支持 javascript 的网络浏览器。

使用这些库,您将能够模拟点击这些链接,然后抓取新加载的内容。

【讨论】:

    【解决方案2】:

    我搜索了commonPagingPost的代码,发现了这个JavaScript函数定义:

    function commonPagingPost (Page, Block, Action) {
                    var Frm = document.mainForm;
                    Frm.RCEPT_NO.value = "";
                    Frm.page.value = Page;
                    Frm.action = Action;
                    Frm.submit ();
    }
    

    所以它的作用是填写“mainForm”并提交。 mainForm 长什么样子?

    <form name="mainForm" method="post" action="">
                    <input type="hidden" name="RCEPT_NO" value="">
                    <input type="hidden" name="search_flag" value="N">
                    <input type="hidden" name="page" value="1">
    </form>
    

    好的,该函数填写了一个表单,将目标页面设置为“Shr01_lis.jsp”,与您尝试抓取的页面相同。我们可以在 Python 中做到这一点吗?是的!

    import requests
    
    r = requests.post(
        "http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp",
        data={
            "RCEPT_NO": "",
            "search_flag": "N",
            "page": "5"
        })
    
    soup = BeautifulSoup(r.text, 'lxml')
    

    我更喜欢requests 而不是 urllib,因为对于 POST 请求,请求更容易处理。

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 2014-08-22
      • 2016-06-29
      • 1970-01-01
      • 2016-11-30
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多