Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.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
如何在不变的URL中使用不同的城市浏览多个网页-Python 3_Python_Html_Web Scraping_Beautifulsoup - Fatal编程技术网

如何在不变的URL中使用不同的城市浏览多个网页-Python 3

如何在不变的URL中使用不同的城市浏览多个网页-Python 3,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我正在访问不同的网站来练习网页抓取,并尝试对以下网站进行网页抓取- 我以前在网上发布过一个类似的问题,我正在抓取同一个网站。提供的答案非常有效,允许我提取一个城市中所有商店的所有lat和long。然而,我也想从多个城市提取lat和long for商店,遇到了一个问题,我需要一些指导。改变城市也不会改变URL 这个网站都是中文的,所以我不得不用谷歌翻译把它翻译成英文,然后一路工作 我如何选择不同的城市显示在上面以红色突出显示的图像中。我基本上点击了那个链接,选择了我想要显示的城市。我想看看不同城

我正在访问不同的网站来练习网页抓取,并尝试对以下网站进行网页抓取-

我以前在网上发布过一个类似的问题,我正在抓取同一个网站。提供的答案非常有效,允许我提取一个城市中所有商店的所有lat和long。然而,我也想从多个城市提取lat和long for商店,遇到了一个问题,我需要一些指导。改变城市也不会改变URL

这个网站都是中文的,所以我不得不用谷歌翻译把它翻译成英文,然后一路工作

我如何选择不同的城市显示在上面以红色突出显示的图像中。我基本上点击了那个链接,选择了我想要显示的城市。我想看看不同城市或北京的商店的经纬度

下面是我目前正在工作的代码。下面的代码只提取上海所有商店的经纬度,显示在默认页面上

import os
import requests
import csv
import time
from bs4 import BeautifulSoup

csv_name = 'Lat_long_practice.csv'
csv = open(csv_name, 'w', encoding='utf-8-sig')

columnTitleRow = "Name, Latitude, Longitude\n"
csv.write(columnTitleRow)

for page_no in range(1, 14):
    data = {'pageIndex': page_no, 'pageSize': 10, 'keyword': '输入餐厅地址或餐厅名称'}

    page = requests.post('http://www.pizzahut.com.cn/StoreList/Index', data=data)

    soup = BeautifulSoup(page.text, 'html.parser')

    print('PAGE', page_no)
    for row in soup.find_all('div',class_='re_RNew'):
        name = row.find('p',class_='re_NameNew').string #Get the name of the store
        info = row.find('input').get('value')
        location = info.split('|')

        #print(location)
        row = ''

        if location[0] == '':
            print(name)
            row = name + ',' + '' + ',' + '' + '\n'
            csv.write(row)
        else:
          location_data = location[0].split(',')
            latitude = location_data[0]
            longitude = location_data[1]
            print(name, latitude, longitude)
            row = name + ',' + latitude + ',' + longitude + '\n'
            csv.write(row)
谢谢你读了一个很长的问题。如果有人能想出我如何使用python和beautifulsoup来提取不同城市的所有坐标,并保持URL不变,那就太棒了。

中也有静态URL

您可以使用
selenium
phantomjs

from selenium import webdriver
url1 = "https://www.tripadvisor.com.tr/Restaurants-g293974-Istanbul.html"

executable_path1 = './phantomjs'
driver = webdriver.PhantomJS(executable_path=executable_path1)
driver.get(url1)

#selecting links in the page
#doing another things

nextpage = driver.find_element_by_xpath("//*[@id='EATERY_LIST_CONTENTS']/div[3]/div//a[contains(.,'Sonraki')]")
nextpage.click()
在伊斯坦布尔,共有386个与餐厅相关的页面,所有页面的url都是相同的(也称为不变url,静态url)

这是我刮tripadvisor的代码之一。我希望它能帮助你


有关更多信息,请检查

如果我理解正确,这里的实际问题是维护和迭代所有可用城市,一次一个

  • 单击“更改城市”按钮(xpath:
    //a[contains(@class,'selected_city')]
  • 幸运的是列表一次全部加载,因此我们可以即时访问所有城市,而无需滚动。
    所有城市都在第二个
    //div[contains(@class,'city\u window')]
    中,因此我们需要迭代其子div
  • 我们将使用字母索引(A-Z之间)和字母中的城市索引来维护索引。因此,让我们定义
    letterIndex
    cityIndex
  • 因为有两个
    city\u sel\u box
    DIV,所以我们将使事情变得更简单,注意第一个相关的内部
    DIV
    是第30个,ID
    选择了\u a2

    因此,我们可以设置
    letterIndex=31
    并从
    cityIndex=1
    开始
  • 第一个循环:迭代
    (//div[contains(@class,'city\u window')]/div)[letterIndex]
    ,其中
    letterIndex
    从31到52
  • 内部循环:在
    上迭代(//div[contains(@class,'city_window')]/div)[letterIndex]/div/a[cityIndex]
    ,使用
    cityIndex
    从1到数组长度
    (//div[contains(@class,'city_window')]/div)[31]/div/a
  • 对于每个迭代,运行原始算法

  • 让我知道它是如何工作的,更重要的是,如果您有进一步的问题。

    当您单击一个城市时,会调用函数addCookie,这是按照
    iplocation={city}|0
    因此,您可以通过发送适当的cookie获得某个城市,例如:

    from urllib.parse import quote_plus
    page = requests.post('http://www.pizzahut.com.cn/StoreList/Index', data=data, cookies={'iplocation': quote_plus('北京市|0|0')})
    

    你能更具体地谈谈你的实际问题吗?嘿,谢谢你的评论。基本上,我需要的是通过不同的城市,提取商店的纬度和经度。但是,默认页面仅显示上海的门店。所以,我希望得到不同城市商店的经度和纬度。我也会修改我的问题,让它更清楚。对不起,伙计,这个问题不属于这里。这只是翻译中文的问题。使用该工具后,我发现有一个“切换城市”按钮。我相信这就是你一直在寻找的是的,我知道有一个叫“切换城市”的按钮,我在上面贴了。这也不是翻译中文的问题。我想知道的是我如何利用python和beautifulsoup中的按钮来获取不同城市的lat和long,不仅仅是从默认页面(只显示上海的商店)中获取,所以你的问题不是关于不断变化的城市,而是关于导出坐标?嘿,cookies中的“1”代表什么?这真的是我必须插入的曲奇吗?我一定会这样尝试。谢谢你的帮助!