记录一下摸索中总结的一些经验和踩过的一些坑,以后有需要时备查——
最基本操作,将网页熬成汤
session = requests.session()
resp = session.post(html_address)
html = resp.content.decode('utf-8')
soup = BeautifulSoup(html, 'lxml')
建立文件夹
path="E:\\本机文件夹\\"+folder #folder为抓取到的出版信息、刊期
if not os.path.exists(path):
os.makedirs(path)
通过下载地址获得文件,保存在建立好的文件夹里
f=requests.get(Download_address)
file_name = "E:\\本机文件夹\\"+folder+"\\"+lecture+".pdf"
with open(file_name,"wb") as code:
code.write(f.content)
新建文件夹,文件下载保存时经常会报错,一般是因为某些字符不支持,需要事先过滤一下
def validateTitle(title):
rstr = r"[\/\\\:\*\?\"\<\>\|\ ]" # '/ \ : * ? " < > | '
new_title = re.sub(rstr, " ", title)
new_title="".join(new_title.split())# 替换为下划线
return new_title
指定标签去除
比如在这一段里,要保留<b>基于局部语义相关性的定义文本义原预测</b>
,但是不要<b>Hot!</b>
,怎么办呢?
这一趴卡了我好久,看了N多个经验贴,最后用的最简单的这种,缺乏基本语法常识的我一开始老是以为这个操作跟find
一样,试图用
contents=[s.extract() for s in soup('sup')]
结果一直得到相反的结果,后来不报希望的直接用了别人那里复制来的原代码,问题解决了!
[s.extract() for s in soup('sup')]
contents = soup.find_all('b') #论文标题
于是小白可以这样理解,对于soup.find
和soup.find_all
来说, 不管find得到了什么,soup还是之前的soup
但是[s.extract() for s in soup('sup')]
运行过后,soup就不再是之前的soup,而是清除掉所有<sup>
标签里面的内容之后的soup啦……
通过指定标签,获取上一级标签
为了实现按期自动抓取,通过“上一期”“下一期”图片来获取上下期的网址
html代码如图
通过小图的链接定位到<img>
标签,用到了find_parent()
来定位img
的上一级标签<a>
,再用get('href')
来获取相邻网页链接
next_page=soup.find('img',src='../../images/btn_previous.gif')
next_address=next_page.find_parent().get('href')
好啦,这一次的经验基本都在这里了,至少同样结构类型的期刊网站都能这样处理了
问题就是python运行这么慢呢?2个多小时啦,才从2020年进行到2013年……
听说python要运行快,涉及多线程、异步运行啥的,小白的理解能力估计挑战不了了
下次再说吧!