|
10鱼币
Python 朋友的作业,我自己没学到爬虫! 想了半天没想懂
运行结果如图
用 url = 'http://www.baidu.com/s?wd=月亮虾饼怎么做&rn=50' 能正确获取编码和网站内容
而 url = 'https://www.baidu.com/s?wd=探店-发现世界.分享生活&rn=50' 却不行
完整代码如下
- import requests #python的http库
- import chardet #用于获取网页的真正编码的第三方库
- import urllib3 #
- import os
- import jieba
- from collections import Counter
- from bs4 import BeautifulSoup #BeautifulSoup第三方库用于从HTML和XML文件中提取数据。
- urllib3.disable_warnings()
- rootPath = os.path.dirname(os.path.realpath(__file__)) #返回文件路径(返回__file__的真实路径)
- userDictPath = os.path.join(rootPath, 'jiebadic.csv')
- jieba.load_userdict(userDictPath)
- jieba.initialize()
- # 大佬看这里 ↓↓↓↓-----------------------------------
- #url = 'http://www.baidu.com/s?wd=月亮虾饼怎么做&rn=50' #百度搜索的网站赋值给url
- url = 'https://www.baidu.com/s?wd=探店-发现世界.分享生活&rn=50'
- response = requests.get(url) #找到 url
- htmlEncoded = response.content #把网站的内容赋值给htmlEncoded
- print(htmlEncoded)
- detectResult = chardet.detect(htmlEncoded) #检测htmlEncoded 返回一个字典键'encoding'的值就是编码
- print(detectResult)
- encoding = detectResult['encoding'] #把字典detectResult中 键'encoding'的‘值'赋给变量encoding ‘值’是自动检测到的 它可能是utf-8
- html = str(htmlEncoded, encoding) #建立一个元组(网站内容,编码)
- soup = BeautifulSoup(html, 'html.parser') #通过BeautifulSoup来解析html变量中Html代码,使用html.parser解析器,因为BeautifulSoup还有其他几种解析器,如xml、html5lib等,所以这里必须确定使用什么解析器
- #print(soup)
- items = soup.select('h3 a') #获取html中所有h3标签下的a标签dom节点元素,所以我们使用了 'h3 a' 这个选择器
- allTitleStr = ''
- for item in items: #历遍items ???循环没有执行 items为空
- resultRedirectUrl = item.attrs['href'] #网页中a标签的href属性值也就是a标签对应的锚链接
- if 'http://' in resultRedirectUrl or \
- 'https://' in resultRedirectUrl: #判断是不是一个真正的链接
- itemHeadRes = requests.head(resultRedirectUrl, verify=False) #使用http协议中的head命令来访问百度加密连接head命令比get命令返回信息更加精简
- itemUrl = itemHeadRes.headers['Location'] #通过headers的Location属性,便能得到解密后的url,我们把这个解密后的url网址存储到itemUrl变量中,以便后续读取页面Title使用。
- try: # 检测异常
- itemRes = requests.get(itemUrl, verify=False) #找到网站itemUrl
- if itemRes.status_code == 200: #if itemRes 的状态条码是 200
- itemHtmlEncoding = chardet.detect(itemRes.content)['encoding'] # --------------↓
- itemHtml = str(itemRes.content, itemHtmlEncoding, errors='ignore')
- itemSoup = BeautifulSoup(itemHtml, 'html.parser') # -------------获取编码 同上面操作一样 通过BeautifulSoup来解析html变量中Html代码....
- if itemSoup.title is not None: # --------------------↓
- itemTitle = itemSoup.title.text.strip()
- #print(itemTitle) # ?---- 没有打印
- allTitleStr += itemTitle+' ' # -------------------提取出html中的title
- except:
- continue #继续执行
- titleWords = [word for word in jieba.lcut(allTitleStr, cut_all=False) if len(word) > 1]
- titleWordsDic = dict(Counter(titleWords))
- titleWordsSortedList = sorted(titleWordsDic.items(), key=lambda x: x[1], reverse=True)
- for item in titleWordsSortedList:
- print(item[0], ':', item[1])
复制代码
|
-
-
|