Я пытаюсь проанализировать информацию из списка URL-адресов, но мой код анализирует одну и ту же страницу каждый раз - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь проанализировать список URL-адресов, сохраненных в формате UTF8 и именованных ссылок в папке ожидания Python. Один из примеров:

'https://www.safirstores.com/%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C#/availability=1/sort=p.sort_order/order=ASC/limit=32/page=44'

, но когда я пытаюсь запустить свой код, он будет анализировать информацию из первой части URL-адреса каждый раз. Это похоже на синтаксический анализ следующего URL:

'https://www.safirstores.com/%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C#'

обратите внимание, что в конце URL стоит #. и я думаю, что это # ​​мешает моим URL измениться. Я не знаю почему.

вот мой полный код:

import requests
import urllib.request
from bs4 import BeautifulSoup
import csv

with open('links.txt','r', encoding="utf8") as f:
urls = f.read().split()

with open('promo.csv', 'w', newline='', encoding='utf-8') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['name', 'links', 'price'])

for url in urls:
    try:
        print(url)
        source = requests.get(url).text
        soup = BeautifulSoup(source, 'lxml')
        divs = soup.find_all('div', class_='caption')
        if divs:
            for div in divs:
                price = div.find('p', {'class':'price'}).text.strip()
                print(price)
                name = div.find('h4', {'class':'name'}).text.strip()
                print(name)
                links = div.find('a')['href']
                print(links)
                print()
                csv_output.writerow([name, links, price])
        else:
            print("Finished")
            break
except Exception as e:
    print(e)

, и мой список URL выглядит следующим образом:

https://www.safirstores.com/آرایشی#/availability=1/sort=p.sort_order/order=ASC/limit=32/page=1
https://www.safirstores.com/آرایشی#/availability=1/sort=p.sort_order/order=ASC/limit=32/page=2
https://www.safirstores.com/آرایشی#/availability=1/sort=p.sort_order/order=ASC/limit=32/page=3

Что я должен сделать, чтобы предотвратить такую ​​проблему?

Заранее спасибо за ваше время.

1 Ответ

0 голосов
/ 06 ноября 2019

Попробуйте это:

import requests
import csv
from bs4 import BeautifulSoup

url = 'https://www.safirstores.com/index.php'

payload = {
'route': 'module/journal2_super_filter/products',
'module_id': '54'}

with open('promo.csv', 'w', newline='', encoding='utf-8') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(['name', 'links', 'price'])


for page in range(1, 100):
    try:
        form = {
        'filters': '/availability=1/sort=p.sort_order/order=ASC/limit=32/page=%s' %page,
        'route': 'product/category',
        'path': '238',
        'manufacturer_id': '',
        'search':'' ,
        'tag':'' }

        source = requests.post(url, params=payload, data=form)

        soup = BeautifulSoup(source.text, 'html.parser')
        divs = soup.find_all('div', class_='caption')
        if divs:
            for div in divs:
                price = div.find('p', {'class':'price'}).text.strip()
                print(price)
                name = div.find('h4', {'class':'name'}).text.strip()
                print(name)
                links = div.find('a')['href']
                print(links)
                print()
                csv_output.writerow([name, links, price])
        else:
            print("Finished")
            break
    except Exception as e:
        print(e)
...