def parse_onepage(html): soup =BeautifulSoup(html,'lxml') div_list=soup.select('div.li_txt') jsons=[] # a = li_list[0].select('div > div.info > div.hd >a > span.title')[0].get.text() # print(a) for node in div_list: title = node.select('h4')[0].get_text() name = node.select('h3 ')[0].get_text() info = node.select('p')[0].get_text() pic=node.select('src') data = {'头衔':title,'老师':name,'简介':info,'图片':pic} jsons.append(data) save(jsons)下载教师图片
时间: 2024-02-23 09:02:09 浏览: 369
在这段代码中,获取教师图片的代码是有问题的。应该使用node.select('img')来获取图片,而不是node.select('src')。修改后的代码如下:
```
def parse_onepage(html):
soup = BeautifulSoup(html, 'lxml')
div_list = soup.select('div.li_txt')
jsons = []
for node in div_list:
title = node.select('h4')[0].get_text()
name = node.select('h3')[0].get_text()
info = node.select('p')[0].get_text()
pic = node.select('img')[0].get('src') # 修改这里的代码
data = {'头衔':title, '老师':name, '简介':info, '图片':pic}
jsons.append(data)
save(jsons)
```
这样就可以获取教师图片了。
相关问题
优化这段代码:import requests import pandas as pd from bs4 import BeautifulSoup from lxml import etree import time import pymysql from sqlalchemy import create_engine from urllib.parse import urlencode # 编码 URL 字符串 start_time = time.time() #计算程序运行时间 def get_one_page(i): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } paras = {'reportTime': '2023-03-23', #可以改报告日期,比如2018-6-30获得的就是该季度的信息 'pageNum': i #页码 } url = 'http://s.askci.com/stock/a/?' + urlencode(paras) response = requests.get(url,headers = headers) if response.status_code == 200: return response.text return None except RequestException: print('爬取失败') def parse_one_page(html): soup = BeautifulSoup(html,'lxml') content = soup.select('#myTable04')[0] #[0]将返回的list改为bs4类型 tbl = pd.read_html(content.prettify(),header = 0)[0] # prettify()优化代码,[0]从pd.read_html返回的list中提取出DataFrame tbl.rename(columns = {'序号':'serial_number', '股票代码':'stock_code', '股票简称':'stock_abbre', '公司名称':'company_name', '省份':'province', '城市':'city', '主营业务收入(201712)':'main_bussiness_income', '净利润(201712)':'net_profit', '员工人数':'employees', '上市日期':'listing_date', '招股书':'zhaogushu', '公司财报':'financial_report', '行业分类':'industry_classification', '产品类型':'industry_type', '主营业务':'main_business'},inplace = True) return tbl def generate_mysql(): conn = pymysql.connect( host='localhost', user='root', password='******', port=3306, charset = 'utf8', db = 'wade') cursor = conn.cursor() sql = 'CREATE TABLE IF NOT EXISTS listed_company (serial_number INT(20) NOT NULL,stock_code INT(20) ,stock_abbre VARCHAR(20) ,company_name VARCHAR(20) ,province VARCHAR(20) ,city VARCHAR(20) ,main_bussiness_income VARCHAR(20) ,net_profit VARCHAR(20) ,employees INT(20) ,listing_date DATETIME(0) ,zhaogushu VARCHAR(20) ,financial_report VARCHAR(20) , industry_classification VARCHAR(20) ,industry_type VARCHAR(100) ,main_business VARCHAR(200) ,PRIMARY KEY (serial_number))' cursor.execute(sql) conn.close() def write_to_sql(tbl, db = 'wade'): engine = create_engine('mysql+pymysql://root:******@localhost:3306/{0}?charset=utf8'.format(db)) try: tbl.to_sql('listed_company2',con = engine,if_exists='append',index=False) # append表示在原有表基础上增加,但该表要有表头 except Exception as e: print(e) def main(page): generate_mysql() for i in range(1,page): html = get_one_page(i) tbl = parse_one_page(html) write_to_sql(tbl) # # 单进程 if __name__ == '__main__': main(178) endtime = time.time()-start_time print('程序运行了%.2f秒' %endtime) # 多进程 from multiprocessing import Pool if __name__ == '__main__': pool = Pool(4) pool.map(main, [i for i in range(1,178)]) #共有178页 emdtime = time.time()-start_time print('程序运行了%.2f秒' %(time.time()-start_time))
这段代码已经很简洁了,但是可以通过以下方式进行优化:
1. 导入模块时可以将相同的模块放在一起,如将requests和pandas放在一起,将BeautifulSoup和lxml放在一起。
2. 导入模块时可以只导入需要的部分,如只导入urlencode函数。
3. 可以将函数或代码段封装成函数或类,使代码结构更清晰。
编写一个功能强大的微博爬虫,例如使用 Python 的 requests 库获取网页内容,BeautifulSoup 或 lxml 解析 HTML,以及 pandas 数据处理,这里提供一个基本的示例来抓取微博的微博数量、评论数量和分类信息。
创建一个功能齐全的微博爬虫通常涉及以下几个步骤:
1. **导入必要的库**:
首先,我们需要导入 `requests` 用于发送 HTTP 请求,`BeautifulSoup` 或 `lxml` 用于解析 HTML,以及 `pandas` 用于数据分析。
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
```
2. **发送请求**:
使用 `requests.get()` 发送请求到微博的用户主页或搜索结果页,并设置合适的头信息以模拟浏览器访问,避免被识别为机器人。
```python
def fetch_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)
return response.text
```
3. **解析 HTML**:
利用 `BeautifulSoup` 解析 HTML 文档,定位包含所需信息的部分。比如微博数量可能在一个特定的 `<div>` 标签内,评论数在另一个 `<span>` 中。
```python
def parse_html(html, selector_dict):
soup = BeautifulSoup(html, 'lxml')
parsed_data = {key: soup.select_one(selector).text for key, selector in selector_dict.items()}
return parsed_data
```
4. **提取关键信息**:
定义一个字典 `selector_dict`,包含每个信息对应的 CSS 选择器。例如:
```python
selector_dict = {
'微博数量': '.weibo-count',
'评论数量': '.comment-count',
'分类信息': 'h1 a[itemprop="name"]'
}
```
5. **遍历和收集数据**:
对于每一条微博,我们都需要获取其详细信息,可以结合翻页、循环等方式。这里以固定页数为例。
```python
def collect_weibo_info(base_url, num_pages):
data = []
for page_num in range(1, num_pages + 1):
url = base_url + f'?page={page_num}'
html = fetch_page(url)
page_data = parse_html(html, selector_dict)
data.append(page_data)
return data
```
6. **数据整理和输出**:
最后将所有数据存储到 `pandas` DataFrame 中,便于后续处理和分析。
```python
def save_to_df(data):
df = pd.DataFrame(data)
print(df)
```
使用上述函数,你可以开始爬取指定微博用户的微博数量、评论数量和分类信息。注意,这只是一个基础框架,实际应用中可能需要处理更多细节,如处理 JavaScript 加载的内容、异常情况等。同时,务必遵守微博的爬虫政策和法规。
阅读全文