|
#记录下第一次使用爬虫进行网页pdf爬取过程和踩坑记录#1.目的第一次做分析,想要在网上搜寻相关的研究报告之类的,但是总是有很多无关的链接文件或者不完整的引流链接,想到一般来说这种报告都是pdf居多,所以直接选择批量爬取.pdf文件再进行筛选会不会更有效率,于是直接开干。最终根据以下三个文章合并起来完成了小白的爬虫第一次。以下是本文的参考链接:爬虫参考:2023最新使用python爬虫爬取全网.pdf网址并下载需要的pdf文件资源(可设置搜索keyword)!!!_如何通过爬虫下载一个网页里面的文档文件-CSDN博客安装chromedriver参考:Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)_chromedriver119-CSDN博客使用selenium打开浏览器报错chromedriver‘executableneedstobeinPATH_chromedriver'executableneedstobeinpath.-CSDN博客2.爬虫前提2.1查看chrome浏览器版本打开chrome浏览器,输入以下代码:chrome://version/这里可以看到我们的版本是126开头且chrome的路径也出来了。2.2下载对应版本的chromedriver 那么我们就前往官网下载对应的driver。点击这里,就会看到这样一个界面: 点击stable,去选择和我们系统对应的版本,这里我们是windows,win32既可以在32也可以在64环境使用,复制链接右键选择转到就可以下载了。 2.3移动chromedrive至python环境 下载好了之后就进行解压,然后就要去查询到我们python路径了,具体方法如下:点击“文件”->“设置”->“python解释器”->虚字路径。找到之后我们把chromedrive直接复制到该路径下的scripts问价夹下即可。这样就算完成了,也不需要加什么环境变量了。 2.4添加selenium标准库 因为刚开始我们是没有这个库的,所以加上代码也会是报错的,所以需要按以下步骤在终端下载:pipinstallselenium这里我已经是下载好了所以只是做演示,注意!!!如果后续仍然报错说缺少哪个模块一样采取以下命令下载补全: pipinstall{模块名}2.5测试用以下测试代码即可,注意的是: chromedriver_path=r"D:\Anaconda3\Scripts\chromedriver.exe"这里面的路径要改为自己计算机下对应的chromedrive路径。fromseleniumimportwebdriverchromedriver_path=r"D:\Anaconda3\Scripts\chromedriver.exe"driver=webdriver.Chrome(chromedriver_path)#登录百度defmain():driver.get("https://baidu.com/")if__name__=='__main__':main()效果应该是这样的:3.爬虫代码3.1爬取链接importurllib.parse#pipinstallurllib3==1.26.2fromseleniumimportwebdriver#pipinstallselenium==3.141.0fromselenium.webdriver.common.keysimportKeysfrombs4importBeautifulSoupimporttimedefscrape_pages(keyword,save_path,total_pages):num=0driver=webdriver.Chrome()foriinrange(total_pages):page=10*i+1url=f'https://www.bing.com/search?q={urllib.parse.quote(keyword)}&first={page}'driver.get(url)elem=driver.find_element_by_tag_name("body")no_of_pagedowns=15whileno_of_pagedowns:elem.send_keys(Keys.PAGE_DOWN)time.sleep(0.2)no_of_pagedowns-=1html=driver.page_sourcesoup=BeautifulSoup(html,'html.parser')#获取所有h2元素h2_elements=soup.find_all('h2')withopen(save_path,'a',encoding='utf-8')asf:forh2inh2_elements:a_tag=h2.find('a')#找到h2下的a标签ifa_tagand'href'ina_tag.attrs:#确保a标签存在并包含href属性href=a_tag['href']#获取href属性的值f.write(href+'\n')num+=1print(f"已保存{i+1}页,共保存了{num}个网址")driver.quit()print(f"爬取完成,共保存了{num}个网址")#爬取200页keyword="小红书filetype:pdf"save_path=r"E:\xiaohongshu.txt"total_pages=10scrape_pages(keyword,save_path,total_pages) 这里要注意的是keyword="小红书filetype:pdf"save_path=r"E:\xiaohongshu.txt"total_pages=10scrape_pages(keyword,save_path,total_pages)keyword指的是你希望搜索的关键词,save_path是在自己电脑下保存的路径也是要自己创建修改的,total_pages指的是你要爬多少页的结果。3.2下载pdf文件importosimportrequestsfromurllib.parseimporturlparsefromretryimportretryimporturllib3importreurllib3.disable_warnings()@retry(tries=3,delay=1,backoff=2)defdownload_file(pdf_url,output_path):response=requests.get(pdf_url,verify=False,stream=True)content_disposition=response.headers.get('content-disposition')ifcontent_disposition:filename=re.findall("filename=(.+)",content_disposition)iffilenameutput_path=os.path.join(output_path,filename[0])withopen(output_path,'wb')asfile:forchunkinresponse.iter_content(chunk_size=1024):ifchunk:file.write(chunk)defdownload_pdfs_from_file(input_file,output_dir,error_file,start_from=1):#创建输出目录os.makedirs(output_dir,exist_ok=True)#创建一个集合用于存放唯一的链接,去重unique_urls=set()#读取文本文件中的所有行,并记录原始索引位置withopen(input_file,'r',encoding='utf-8')asfile:lines=file.readlines()forlineinlines:if'.pdf'inline:unique_urls.add(line.strip())#获取PDF文件数量total_pdfs=len(unique_urls)unique_urls=list(unique_urls)#从指定位置开始下载PDF文件foridxinrange(start_from-1,total_pdfs):pdf_url=unique_urls[idx]try:#下载PDF文件并保存至输出目录print(f'Downloadingfile{idx+1}/{total_pdfs}:{pdf_url}')parsed_url=urlparse(pdf_url)filename=os.path.basename(parsed_url.path)output_path=os.path.join(output_dir,filename)download_file(pdf_url,output_path)print(f'\nDownloaded{pdf_url}')exceptExceptionase:#输出错误信息至指定文件print(f'\nFailedtodownload{pdf_url}:{str(e)}')withopen(error_file,'a',encoding='utf-8')aserr_file:err_file.write(f'{pdf_url}\n')finally:pass#设定输入文件路径、输出目录路径和错误输出文件路径,并指定开始下载的位置input_file_path=r"E:\xiaohongshu.txt"output_directory=r"E:\资料\小红书\pdf"#桌面创建pdf文件夹error_output_file=r"E:\资料\小红书\pdf\false-url.txt"#下载失败的url,可手动下载补充start_download_from=1#从第几个url开始#调用函数下载PDF文件,传入开始下载的位置参数和错误输出文件路径download_pdfs_from_file(input_file_path,output_directory,error_output_file,start_from=start_download_from) 这里要注意的仍然是路径问题,input_file_path是输入文件的路径,也就是上面爬取链接路径保存下来的那个txt文件。output_directory指的是下载下来的pdf要存放的文件夹的路径。error_output_file相当于异常处理,把下载失败的链接名记录下来。input_file_path=r"E:\xiaohongshu.txt"output_directory=r"E:\资料\小红书\pdf"#桌面创建pdf文件夹error_output_file=r"E:\资料\小红书\pdf\false-url.txt"#下载失败的url,可手动下载补充总结以上就是一个简单的爬取pdf的方法过程了,具体实践后,会发现有可能下载到完全不相关的文件,这个就需要在进行具体筛选了,也可以在代码层面进行改进。也的确省下了不少的时间去搜索。
|
|