【问题标题】:Python 3, Beautifulsoup, and urlopen web scrapingPython 3、Beautifulsoup 和 urlopen 网页抓取
【发布时间】:2018-09-29 12:38:31
【问题描述】:

我正在搜索这个website 网站,以获取有关产品描述和价格等产品的信息。该网站使用分页仅加载前 20 个产品,当我进行抓取时,我的程序仅获取前 20 个产品。我怎样才能得到所有这些产品。 这是我的代码

 from bs4 import BeautifulSoup
 from urllib.request import urlopen
 import csv
 import random


myfile = open('example.csv', 'w')

def scrape():
    page = urlopen('https://www.olx.com.ng/')
    soup = BeautifulSoup(page.read(), 'html.parser')


    for price, description  in zip(soup.findAll('p', 
    {'class':'_13OzP'}),soup.findAll('p',{'class':'_2uySz'})):
    info = price.text + ' -------------------------- ' + description .text
    print(info)

` 这是html结构image 的示例图像检查我在图像上用红色标记的区域

【问题讨论】:

  • 你不能只用beautifulsoup,考虑使用selenium自动点击下一步按钮,或者是真正的hacky来模拟API请求以获得下一页的结果。
  • 为此,您需要使用 selenium 导航到页面并使用 seleniums 加载 javascript 以向下滚动以上传所有数据。我建议先加载所有数据,然后刮掉它。
  • 好的,谢谢,请问有什么好的硒教程吗?
  • 即使我设法手动加载更多页面,它仍然没有获得所有数据,它仍然只返回前 20 个页面
  • 我有时会使用 selenium,但通常有更好的方法,在这种情况下使用 API。

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


【解决方案1】:

您可以直接访问 API。您需要从第一个请求中读取“光标”并将其传递给下一个请求以获取下一组结果。此示例使用请求,但您可以轻松调整它以使用 urllib。

import requests
import json
cursor = "0"
for i in range (30):
    r = requests.get("https://www.olx.com.ng/api/items?query=%7B%22sorting%22%3A%22desc-creation%22%7D&cursor=" + cursor)
    j = r.json()
    cursor = j['metadata']['cursor']
    for d in j['data']:
        print ("Title: {}, Price {}".format(d['title'].encode("utf-8"), d['price']['value']['raw']))

输出:

Title: Brand New 2.5HP Electric Motorized Treadmill With Mp3 Player Exercise, Price 250000
Title: Tokunbo Toyota Venza 2012 White, Price 6500000
Title: Clean Registered 2007 Toyota Tundra, Price 3550000
Title: Ladies Bike Hajour Lucky, Price 80000
Title: 110k p/a two bedroom to let in Agbede, Price 110000
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 2018-04-25
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2014-06-20
    相关资源
    最近更新 更多