【问题标题】:Can`t crawl web site无法抓取网站
【发布时间】:2018-09-11 11:48:59
【问题描述】:

我想爬,但是遇到了一些麻烦,我需要打开商品的每个链接并获取它的信息并将其保存为.html每个商品的页面 现在我只能打印页面上的所有链接

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
import requests
import urllib3
import ssl
from requests import request

urllib3.disable_warnings()

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
        pass
else:
    ssl._create_default_https_context = _create_unverified_https_context

PYTHONHTTPSVERIFY=0
    user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
headers = {'User-Agent': user_agent}
t = request('GET', url=my_url, headers=headers, verify=False).text
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")

containers = page_soup.findAll("div", {"class": 'product'})

filename = "web.html"
f= open(filename, "w")

for containers in page_soup.findAll('div', attrs={'class': 'product'}):
    f.write(containers.a['href'] + '\n')
f.close()

【问题讨论】:

  • 让我们从这个开始:你为什么要提出两个相同的请求?只是为了看看它是如何工作的?在您提出请求后,我没有看到您使用 t
  • t 用于 ssl 验证,我可以肯定删除其中的 1 个,那就是 nvm,我无法在所有页面中找到所有优点并通过链接删除所有信息
  • 到目前为止,您编写了所有 URL 的列表。请edit您的问题,以显示您试图从这些网址中获取哪些信息。

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


【解决方案1】:

您似乎试图从第一个 URL 中获取 URL 列表,然后想从每个 URL 中获取一些信息。为此,需要对每个 URL 发出请求,并且每个 URL 都需要单独的 BeautifulSoup 解析。

获得子页面后,即可提取信息,例如产品名称及其价格。

最后,您可以打印此信息或将其写入文件。最简单的方法是将其编写为 CSV 文件。在这个例子中,我展示了如何将 URL 和名称以及价格写成一行。 CSV 库会自动正确格式化:

from urllib3.exceptions import InsecureRequestWarning
from bs4 import BeautifulSoup
import requests
import csv

requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
my_url = 'https://franke-market.com.ua/moyki.html?on_page=100'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'}
req = requests.get(my_url, headers=headers, verify=False)
soup = BeautifulSoup(req.content, "html.parser")

with open("products.csv", "w", newline="") as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(['URL', 'Title', 'Price'])

    # Find the URLs for all the products
    for div in soup.find_all('div', attrs={'class': 'product'})[:5]:
        url = div.a['href']
        print(url)

        # For each URL, get the sub page and get the name and price
        req_sub = requests.get(url, headers=headers, verify=False)
        soup_sub = BeautifulSoup(req_sub.content, "html.parser")        
        title = soup_sub.find('h1', class_='title').text
        price_info = soup_sub.find('div', class_='price_info').span.text

        # Write the url, name and price as a CSV file
        csv_output.writerow([url, title, price_info])

给你和output.csv文件开始:

URL,Title,Price
https://franke-market.com.ua/franke_rol_610-38_101_0267_707_.html,Franke ROL 610-38 (101.0267.707),91795
https://franke-market.com.ua/franke-pmn-611i-101.0255.790.html,Franke Pamira PMN 611i (101.0255.790),57935
https://franke-market.com.ua/franke_pxl_611-60_101_0330_655_.html,Franke PXL 611-60 (101.0330.655),93222
https://franke-market.com.ua/franke-ron-610-41-101.0255.783.html,Franke Ron 610-41 (101.0255.783),57939
https://franke-market.com.ua/franke_pxl_611-78_101_0330_657_.html,Franke PXL 611-78 (101.0330.657),93223

然后您可以将此文件打开到电子表格应用程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-29
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多