Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何抓取分页页面?单击“下一页”时,url没有更改_Python 3.x_Beautifulsoup_Web Crawler_Urlopen - Fatal编程技术网

Python 3.x 如何抓取分页页面?单击“下一页”时,url没有更改

Python 3.x 如何抓取分页页面?单击“下一页”时,url没有更改,python-3.x,beautifulsoup,web-crawler,urlopen,Python 3.x,Beautifulsoup,Web Crawler,Urlopen,我使用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') so

我使用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没有变化,也没有模式。

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

网站在这里 我在分页课上找到了线索。 我找到了一些下一页的链接,但我不知道如何使用这个链接 在美丽的乌苏。我认为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时,我只得到第一页

仅使用beautifulsoup无法做到这一点,因为它不支持ajax。您需要使用类似于、或其他支持javascript的web浏览器


使用这些库,您可以模拟单击这些链接,然后抓取新加载的内容。

我在代码中搜索了
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>

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

在web浏览器中使用Inspect Element工具,然后在手动单击页码时执行一些网络捕获。分页很可能由HTTP POST请求处理。如果您能够收集POST请求的有效负载是什么,那么您很可能能够精心设计您的请求头,以便能够在编号的页面中移动。
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')