马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请问各位大佬,我这个代码为什么运行起来,浏览器一闪而过,也没有爬取到任何数据,这是为什么呢import time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import urljoin
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')
INDEX_URL = 'https://spa2.scrape.center/page/{}'
TIME_OUT = 10
PAGE = 10
#初始化浏览器对象
path = 'D:/技能/chromedriver.exe'
brower = webdriver.Chrome(executable_path=path)
#显式等待
wait = WebDriverWait(brower,TIME_OUT)
#发起请求
def scrape_page(url,condition,locator):
logging.info('正在爬取:{}'.format(url))
try:
brower.get(url)
wait.until(condition(locator))#调用wait的until方法,并传入判断条件
except TimeoutException:
logging.error('error occurred while scraping {}'.format(url),exc_info=True)
#加载列表页
def scrape_index(page):
url = INDEX_URL.format(page)
scrape_page(url,condition=EC.visibility_of_all_elements_located,locator=(By.CSS_SELECTOR,'#index .item'))
#解析列表页
def parse_index():
elements = brower.find_elements(By.CSS_SELECTOR,'#index .item .name')
for element in elements:
#提取属性
href = element.get_attribute('href')
yield urljoin(INDEX_URL,href)
def main():
try:
for page in range(1,PAGE+1):
scrape_index(page)
detail_urls = parse_index()
logging.info('详情页地址:{}'.format(detail_urls))
finally:
brower.close()
if __name__ == '__main()__':
main()
看起来你的代码应该是正确的,但你可能忽略了一点,就是你在 if __name__ == '__main__': 后面多了一个括号。正确的写法应该是 if __name__ == '__main__': ,而不是 if __name__ == '__main__()': 。
这是因为, if __name__ == '__main__': 是Python中常用的用于判断当前脚本是否作为主程序运行的语句。 '__main__' 是当前模块的名字,当模块被直接运行时模块名为 '__main__' 。当你错误地写成 '__main__()' 时,Python就无法正确判断当前脚本是否为主程序,所以main()函数就没有被调用,导致了你的代码没有按预期运行。
你只需要删除这个括号,代码应该就可以正常运行了:
if __name__ == '__main__':
main()
还有一点需要注意,你在调用 scrape_index(page) 后直接调用了 parse_index() ,这可能会在页面还没有完全加载的时候就开始解析,可能导致爬取失败。你可以试试将 parse_index() 放在 scrape_index(page) 的内部,在确认页面加载完毕后再开始解析。
|