MCPcopy Create free account
hub / github.com/apify/crawlee-python / HeaderGenerator

Class HeaderGenerator

src/crawlee/fingerprint_suite/_header_generator.py:26–84  ·  view source on GitHub ↗

Generate realistic looking or browser-like HTTP headers.

Source from the content-addressed store, hash-verified

24
25@docs_group('Other')
26class HeaderGenerator:
27 """Generate realistic looking or browser-like HTTP headers."""
28
29 def __init__(self) -> None:
30 self._generator = BrowserforgeHeaderGenerator()
31
32 def _select_specific_headers(self, all_headers: dict[str, str], header_names: set[str]) -> HttpHeaders:
33 return HttpHeaders({key: value for key, value in all_headers.items() if key in header_names})
34
35 def get_specific_headers(
36 self, header_names: set[str] | None = None, browser_type: SupportedBrowserType = 'chrome'
37 ) -> HttpHeaders:
38 """Return subset of headers based on the selected `header_names`.
39
40 If no `header_names` are specified, full unfiltered headers are returned.
41 """
42 all_headers = self._generator.generate(browser_type=browser_type)
43
44 if not header_names:
45 return HttpHeaders(all_headers)
46 return self._select_specific_headers(all_headers, header_names)
47
48 def get_common_headers(self) -> HttpHeaders:
49 """Get common HTTP headers ("Accept", "Accept-Language").
50
51 We do not modify the "Accept-Encoding", "Connection" and other headers. They should be included and handled
52 by the HTTP client or browser.
53 """
54 all_headers = self._generator.generate()
55 return self._select_specific_headers(all_headers, header_names={'Accept', 'Accept-Language'})
56
57 def get_random_user_agent_header(self) -> HttpHeaders:
58 """Get a random User-Agent header."""
59 all_headers = self._generator.generate()
60 return self._select_specific_headers(all_headers, header_names={'User-Agent'})
61
62 def get_user_agent_header(
63 self,
64 *,
65 browser_type: SupportedBrowserType = 'chrome',
66 ) -> HttpHeaders:
67 """Get the User-Agent header based on the browser type."""
68 if browser_type not in {'chrome', 'firefox', 'safari', 'edge'}:
69 raise ValueError(f'Unsupported browser type: {browser_type}')
70 all_headers = self._generator.generate(browser_type=browser_type)
71 return self._select_specific_headers(all_headers, header_names={'User-Agent'})
72
73 def get_sec_ch_ua_headers(
74 self,
75 *,
76 browser_type: SupportedBrowserType = 'chrome',
77 ) -> HttpHeaders:
78 """Get the sec-ch-ua headers based on the browser type."""
79 if browser_type not in {'chrome', 'firefox', 'safari', 'edge'}:
80 raise ValueError(f'Unsupported browser type: {browser_type}')
81 all_headers = self._generator.generate(browser_type=browser_type)
82 return self._select_specific_headers(
83 all_headers, header_names={'sec-ch-ua', 'sec-ch-ua-mobile', 'sec-ch-ua-platform'}

Calls

no outgoing calls