最近在学python,虽然说是开始,但是就是开始在学。因为之前没有体会到python的魅力,所以学了又丢了。现在是第二次学习了。
因为之前学习的时候心静不下来,导致很多的东西都学不下去。之前学长还布置了一个爬虫作业,心烦气躁的我就学了一个urlib
库,因为BeautifulSoup安装失败,而且觉得re又很难,根本学不会。然后中途就放弃了。现在的话就是重拾基础吧,知道自己比别人浪
费了很多时间,所以也没有所以了,自己默默努力就好。
爬虫这个东西嘛,很烦,真的很烦,这是对于我这种初学者来说的。爬虫的话,要学requests库,要学bs4,要学re,等等,总而
言之,需要非常多的知识。
下面就开始介绍爬虫了。
因为我比较喜欢的 requests,beautifulsoup 以及 re
requests库
方法:get post put delete head options
返回值主要有 status_code
requests.get(url, params = xxx, headers =xxxxx)
url即为url,params 为get参数,headers 为请求报文
requests.post(url, ,data = , headers =) data为post 传参所需要的传输的数据。
无论是headers params 还是 data ,其数据都应该为字典。字典不区分大小
常用的有requests.content 返回的是二进制,下载文件比如图片专用的。
beautifulsoup
可能比较乱,这是我学习的一个总结了。这是一个py文件,比较懒,都理解下哈。
import bs4 html = """ <body> <a href="helloworld.com">helloworld.com</a> <a href="helloworld.com">helloworld.cadom</a></body>""" # <a href="helloworld.com">helloworld.cadom</a> # </body # """ soup = bs4.BeautifulSoup(html,features='html.parser') #传入解析器:lxml html=soup.prettify() # print(soup.prettify()) #格式化代码,自动补全 # print(html) # print(soup.a)#得到title标签里的内容 print(soup.a.name) #获取名称 print(soup.a.string,type(soup.a.string)) #获取单纯内容 print(type(soup.a)) #获取类型 print(soup.a.attrs) #获取属性(字典) print(soup.a['href']) #获取单个属性 soup.a.get('href') soup.p['class']="newClass" 修改属性 del soup.p['class'] 删除属性 print(soup.body.strings) <--! soup.body.stripped_strings 更加完美,因为可以去掉多余的字符串--> for i in soup.body.strings: #返回一个标签的所有字符串,但是需要遍历。如果一个标签有多个字符串,那么只能用这种方法 print(i,end='') print(soup.body.contents[1]) #contents 返回整个字节点,通过控制数值来控制输出 for list_soup in soup.body.children: #chidren 和content类似,但是children是一个迭代器对象。 print(list_soup,end='') for list_childs in soup.body.descendants: #这个是遍历,返回所有后代的节点 print(list_childs) previous_sibling 兄弟节点, parent 父节点 parents所有前辈节点 .next_elements .previous_elements 前后字节 print(soup.find_all("text")) 搜索 #这里还可以传参,不同的参数,还可以利用正则表达式 具体参考https://blog.csdn.net/slhlde/article/details/81937838 find_all( name , attrs , recursive , text , **kwargs ) 除了属性,全部都是从标签开始的,不能直接搜索字符串。如果想直接搜索字符串,建议,直接使用re不用beautifulsoup。 使用遍历,就可以一条一条地获取名字,内容,链接 这个是比较厉害的东西,用的比较多,主要用来寻找链接
re
1. import re re.match(pattern,string,flags) string为匹配的字符串,pattern为需要匹配的一段字符串或者正则表达式,falgs为标志位。返回值为true or False. 注意: match为从开头开始匹配,如果匹配则返回一个成功的匹配,返回值为1,如果开头不匹配则返回0 如果需要返回字符串,那么需要 re.match.group() |default=all ,可以选择 1,2,3,4,5,----- 选择依据为 "()" 2. re.search re.search(pattern, string, flags=0) 跟上面差不多。 注意:不是从开头开始匹配,匹配成功1,返回一个匹配项,然后就跟match差不多 3.re pattern 格式为: r'/ /' 4.compile re.compole(pattern,flags) 注意,compile函数之后,所有的函数将不再需要pattern这个参数 5. re.findall(pattern,string,flags) 返回的是一个列表,当不匹配是,返回的是一个空列表。 6. re.finditer 与 findall类似,但是这里有一个优势就是findall返回一个迭代器,这个可以有。 7.关于flags 常见的有 re.I 取消大小匹配,其他的自行百度。 8. 特殊字符 ^ 开头匹配 $ 结尾匹配 +匹配一个或者多个 * 匹配0个或者多个 ? 零或一个 re+ re* 贪婪匹配 {m,n}表示前一个字符匹配m到n次 () 这个表示一个group(),适当地使用group可以有效地高效地工作。 9. \w 匹配字母数字及下划线 \d 匹配任意的数字 其他的自行百度 10.[ ] 表示在其中选一个作为匹配项,如果[ ]中含有^则表示匹配除了这些字符的所有字符。 [0-9] 匹配任何数字。类似于 [0123456789] [^0-9] 匹配除了数字外的字符 11. | 表示多个选择匹配, a|b|c|d|e|f|g 从前面开始匹配,如果匹配成功则不再匹配,如果失败 则继续匹配。
看了上边的东西,差不多就可以写个爬虫了。
先上代码。代码里面有解释,应该都可以看懂吧。
import requests import re import bs4 def search(url): header={"Host":"www.freebuf.com","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win32; x32; rv:76.0) Gecko/20100101 Firefox/76.0", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding":"gzip, deflate, br", "DNT":"1", "Connection":"keep-alive", "Cookie":"wordpress_logged_in_a4d81fc826559e0a94da2a95b91820a7=Netpr1s0ner%7C1591332117%7C6d2091bbc58d7268682e0e0a19846ff4; 3cb185a485c81b23211eb80b75a406fd=1590070802", "Upgrade-Insecure-Requests":"1", "X-Forwarded-For":"127.0.0.1", "Cache-Control":"max-age=0" } response=requests.get(url,headers=header) soup=bs4.BeautifulSoup(response.text,'lxml') #bs4解析 return soup.find_all("a",target="_blank") #这个是爬虫的常用东西,寻找全部的标签,然后限制属性,就可以找到想要的东西 def deal(data): list=['0'] re_pattern=re.compile(r'^<a.+href="(.+html).*".*target') for i in data: if "https://www.freebuf.com/news" in str(i): #限制新闻的标题 # print((i.text),type(i.text)) 这个是标签的string(纯中文) # print(str(i),type(str(i))) 这个是str类型的标签的全部内容 if(i.text.strip()=="" or i.text.strip()=="资讯" or i.text.strip()=="关于我们"): #筛选无用信息 continue list.append(i.text.strip()+"\n\n"+re_pattern.search(str(i)).group(1)+"\n\n") #添加到列表 list.pop(0) #判断需要用到 -1 ,所以开头设置 list[0]='0' return list def main(): url="https://www.freebuf.com/" list = deal(search(url)) print("\n\n\n") print("**--**","今天的重要新闻".center(30),"**--**",end="\n\n\n\n") for i in list: print(" "+i,end="\n\n") if __name__ == "__main__": main()
写爬虫首先要做的是分析页面,查看页面的连接规则,然后再使用beautifulsoup或者是re进行匹配。
个人认为,beautifsoup与re各有千秋,如果页面的链接比较规则,那么就可以使用beautifulsoup。re是全篇通杀,简单粗暴,有害
有利吧。