【发布时间】:2018-12-07 13:54:15
【问题描述】:
我正在尝试从主页(已完成)上所有列出的类别 URL 以及网站及其分页链接的更多子类别页面中抓取数据。网址是here
我已经创建了 Python 脚本来提取模块化结构中的数据,因为我需要在一个单独的文件中从一个步骤到另一个步骤的所有 URL 的输出。但是现在我面临着提取所有分页 URL 的问题,之后将从中获取数据。此外,我仅从第一个子类别 URL 获取数据,而不是来自所有列出的子类别 URL 的数据。
例如在我下面的脚本中,数据来自 >>>>>
一般实践(主类别页面)-http://www.medicalexpo.com/cat/general-practice-K.html 和进一步的听诊器(子类别页面)-http://www.medicalexpo.com/medical-manufacturer/stethoscope-2.html
只是来了。我想要此链接上给出的所有列出的子类别链接的数据
如果能从所有列出的子类别页面中获得具有产品 URL 的所需输出,我们将不胜感激。
下面是代码:
import re
import time
import random
import selenium.webdriver.support.ui as ui
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from lxml import html
from bs4 import BeautifulSoup
from datetime import datetime
import csv
import os
from fake_useragent import UserAgent
# Function to write data to a file:
def write_to_file(file,mode, data, newline=None, with_tab=None): #**
with open(file, mode, encoding='utf-8') as l:
if with_tab == True:
data = ''.join(data)
if newline == True:
data = data+'\n'
l.write(data)
# Function for data from Module 1:
def send_link(link1):
browser = webdriver.Chrome()
browser.get(link1)
current_page = browser.current_url
print (current_page)
soup = BeautifulSoup(browser.page_source,"lxml")
tree = html.fromstring(str(soup))
# Added try and except in order to skip/pass attributes without any value.
try:
main_category_url = browser.find_elements_by_xpath("//li[@class=\"univers-group-item\"]/span/a[1][@href]")
main_category_url = [i.get_attribute("href") for i in main_category_url[4:]]
print(len(main_category_url))
except NoSuchElementException:
main_category_url = ''
for index, data in enumerate(main_category_url):
with open('Module_1_OP.tsv', 'a', encoding='utf-8') as outfile:
data = (main_category_url[index] + "\n")
outfile.write(data)
# Data Extraction for Categories under HEADERS:
try:
sub_category_url = browser.find_elements_by_xpath("//li[@class=\"category-group-item\"]/a[1][@href]")
sub_category_url = [i.get_attribute("href") for i in sub_category_url[:]]
print(len(sub_category_url))
except NoSuchElementException:
sub_category_url = ''
for index, data in enumerate(sub_category_url):
with open('Module_1_OP.tsv', 'a', encoding='utf-8') as outfile:
data = (sub_category_url[index] + "\n")
outfile.write(data)
csvfile = open("Module_1_OP.tsv")
csvfilelist = csvfile.readlines()
send_link2(csvfilelist)
# Function for data from Module 2:
def send_link2(links2):
browser = webdriver.Chrome()
start = 7
end = 10
for link2 in (links2[start:end]):
print(link2)
ua = UserAgent()
try:
ua = UserAgent()
except FakeUserAgentError:
pass
ua.random == 'Chrome'
proxies = []
t0 = time.time()
response_delay = time.time() - t0
time.sleep(10*response_delay)
time.sleep(random.randint(2,5))
browser.get(link2)
current_page = browser.current_url
print (current_page)
soup = BeautifulSoup(browser.page_source,"lxml")
tree = html.fromstring(str(soup))
# Added try and except in order to skip/pass attributes without value.
try:
product_url = browser.find_elements_by_xpath('//ul[@class=\"category-grouplist\"]/li/a[1][@href]')
product_url = [i.get_attribute("href") for i in product_url]
print(len(product_url))
except NoSuchElementException:
product_url = ''
try:
product_title = browser.find_elements_by_xpath("//ul[@class=\"category-grouplist\"]/li/a[1][@href]") # Use FindelementS for extracting multiple section data
product_title = [i.text for i in product_title[:]]
print(product_title)
except NoSuchElementException:
product_title = ''
for index, data2 in enumerate(product_title):
with open('Module_1_2_OP.tsv', 'a', encoding='utf-8') as outfile:
data2 = (current_page + "\t" + product_url[index] + "\t" + product_title[index] + "\n")
outfile.write(data2)
for index, data3 in enumerate(product_title):
with open('Module_1_2_OP_URL.tsv', 'a', encoding='utf-8') as outfile:
data3 = (product_url[index] + "\n")
outfile.write(data3)
csvfile = open("Module_1_2_OP_URL.tsv")
csvfilelist = csvfile.readlines()
send_link3(csvfilelist)
# Function for data from Module 3:
def send_link3(csvfilelist):
browser = webdriver.Chrome()
for link3 in csvfilelist[:3]:
print(link3)
browser.get(link3)
time.sleep(random.randint(2,5))
current_page = browser.current_url
print (current_page)
soup = BeautifulSoup(browser.page_source,"lxml")
tree = html.fromstring(str(soup))
try:
pagination = browser.find_elements_by_xpath("//div[@class=\"pagination-wrapper\"]/a[@href]")
pagination = [i.get_attribute("href") for i in pagination]
print(pagination)
except NoSuchElementException:
pagination = ''
for index, data2 in enumerate(pagination):
with open('Module_1_2_3_OP.tsv', 'a', encoding='utf-8') as outfile:
data2 = (current_page + "\n" + pagination[index] + "\n")
outfile.write(data2)
dataset = open("Module_1_2_3_OP.tsv")
dataset_dup = dataset.readlines()
duplicate(dataset_dup)
# Used to remove duplicate records from a List:
def duplicate(dataset):
dup_items = set()
uniq_items = []
for x in dataset:
if x not in dup_items:
uniq_items.append(x)
dup_items.add(x)
write_to_file('Listing_pagination_links.tsv','w', dup_items, newline=True, with_tab=True)
csvfile = open("Listing_pagination_links.tsv")
csvfilelist = csvfile.readlines()
send_link4(csvfilelist)
# Function for data from Module 4:
def send_link4(links3):
browser = webdriver.Chrome()
for link3 in links3:
print(link3)
browser.get(link3)
t0 = time.time()
response_delay = time.time() - t0
time.sleep(10*response_delay)
time.sleep(random.randint(2,5))
sub_category_page = browser.current_url
print (sub_category_page)
soup = BeautifulSoup(browser.page_source,"lxml")
tree = html.fromstring(str(soup))
# Added try and except in order to skip/pass attributes without value.
try:
product_url1 = browser.find_elements_by_xpath('//div[@class=\"inset-caption price-container\"]/a[1][@href]')
product_url1 = [i.get_attribute("href") for i in product_url1]
print(len(product_url1))
except NoSuchElementException:
product_url1 = ''
for index, data in enumerate(product_url1):
with open('Final_Output_' + datestring + '.tsv', 'a', encoding='utf-8') as outfile:
data = (sub_category_page + "\t" + product_url1[index] + "\n")
outfile.write(data)
# PROGRAM STARTS EXECUTING FROM HERE...
# Added to attach Real Date and Time field to Output filename
datestring = datetime.strftime(datetime.now(), '%Y-%m-%d-%H-%M-%S') # For filename
#datestring2 = datetime.strftime(datetime.now(), '%H-%M-%S') # For each record
send_link("http://www.medicalexpo.com/")
【问题讨论】:
-
我认为通过对网站进行逆向工程会更好(并且更快)。查看使用搜索字段时网络选项卡中发生的情况。 Json 作为回报...
标签: python selenium web-scraping beautifulsoup request